• 根据用户输入的内容,导入模块
#根据用户输入的内容,导入模块
inp = input("请输入模块名: ")
print(inp,type(inp)) dd = __import__(inp)
r = dd.f1()
print(r) inp = input('请输入模块:')
inp_func = input('请输入要执行的函数:') #_-import__用于以字符串的形式导入模块
dd = __import__(inp)
  • 以字符串的形式去某个模块中寻找函数
 #getattr 用于以字符串的形式去某个模块中寻找函数
target_func = getattr(dd,inp_func,None)
#在获取到的函数名后加()表示执行函数
#result = target_func()
print( target_func) import commo #判断函数是否存在
r = hasattr(commo,'AGE')
print(r) #设置函数
setattr(commo,'AGE',lambda a:a+1)
r = hasattr(commo,'AGE')
print(r) #删除成员
delattr(commo,'NAME')
r = hasattr(commo,'NAME')
print(r)
  • 导入模块扩展方法:

方法1、import 模块

方法2、a = __import__(“模块名”)

方法3、 a = __import__(‘lib.test.com’,fromlist=True)

方法举例:

 #index.py
from lib import account url = input("请输入url: ")
if url.endswith("login"):
a = account.login()
print(a)
elif url.endswith('logout'):
b = account.logout()
print(b)
elif url.endswith('nb'):
c = account.nb()
print(c)
else:
print("") #account.py
def login():
return "login" def logout():
return "logout" def nb():
return "牛逼网页" 输出结果:
请输入url: www.hao.com/nb
牛逼网页

方法一

  • 方法二目录结构如下:

 url = input("请输入url: ")
inp = url.split('/')[-1]
if hasattr(account,inp):
target_func = getattr(account,inp)
r = target_func()
print(r)
else:
print('')

进一步优化方法二

  • 方法三目录结构,多模块目录结构情况下进行动态导入模块,如下:

 #模块名/函数名
url = input("请输入url: ") target_module,target_func = url.split('/')
m = __import__("lib." + target_module,fromlist=True) if hasattr(m,target_func):
target_func = getattr(m,target_func)
r = target_func()
print(r)
else:
print('') 输出结果:
请输入url: order/add_order
添加订单

再进一步优化方法三

  • 利用反射查看面向对象成员归属
 class Annimal:
def __init__(self):
print("父类构造方法")
self.ty = "动物"
def eat(self):
print("%s%s在吃东西" % (self.name,self.n)) class Cat(Annimal):
def __init__(self,name):
print("子类构造方法")
self.name = name
self.n = "猫"
super(Cat,self).__init__() #常用第一种方法,执行父类初始化数据
#Annimal.__init__(self) #第二种方法 #数据初始化
c = Cat("张三的")
c.eat()
print(c.__dict__) #反射:对象,即可以找对象,又可以找类的成员
r1 = hasattr(c,'eat')
print(r1)
r2 = hasattr(c,'name')
print(r2)
  • 利用反射导入模块、查找类、创建对象、查找对象中的成员
 #!/usr/bin/env python
#coding=utf-8
__author__ = 'yinjia' #test3.py
class Foo:
def __init__(self,name):
temp = "xxx"
self.name = name def show(self):
print('show')
 #!/usr/bin/env python
#coding=utf-8
__author__ = 'yinjia' #test4.py
#导入模块
m = __import__("test3",fromlist=True) #去模块中找类
class_name = getattr(m,"Foo") #根据类创建对象
obj = class_name("Yinjia") #去对象中找name对应的值
val = getattr(obj,'name')
print(val)

python_基于反射模拟Web框架路由系统的更多相关文章

  1. ASP.NET Web API路由系统:路由系统的几个核心类型

    虽然ASP.NET Web API框架采用与ASP.NET MVC框架类似的管道式设计,但是ASP.NET Web API管道的核心部分(定义在程序集System.Web.Http.dll中)已经移除 ...

  2. ASP.NET Web API路由系统:Web Host下的URL路由

    ASP.NET Web API提供了一个独立于执行环境的抽象化的HTTP请求处理管道,而ASP.NET Web API自身的路由系统也不依赖于ASP.NET路由系统,所以它可以采用不同的寄宿方式运行于 ...

  3. Python基础篇【第3篇】: Python异常处理、反射、动态导入、利用反射的web框架

    异常处理 什么是异常? 异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行. 一般情况下,在Python无法正常处理程序时就会发生一个异常.异常是Python对象,表示一个错误.当P ...

  4. 实现基于netty的web框架,了解一下

    上一篇写了,基于netty实现的rpc的微框架,其中详细介绍netty的原理及组件,这篇就不过多介绍 这篇实现基于netty的web框架,你说netty强不强,文中有不对的地方,欢迎大牛指正 先普及几 ...

  5. 基于 CSS 的 Web 框架 CJSS

    CJSS 是一个基于 CSS 的 Web 框架,所有效果都在 CSS 文件中生效,可以在 CSS 中使用它添加更多功能,或者构建一个完整的页面. 使用方法: HTML 想要使用某个组件,在 CSS 文 ...

  6. Python 之反射和普通方式对比(模拟Web框架)

    先模拟一个web页面的选择不同输出不同 vim day8-7.py #!/usr/bin/python # -*- coding:utf-8 -*- import home import accoun ...

  7. django框架--路由系统

    目录 一.路由系统理解 二.路由系统功能划分 三.路由表创建 创建工具 二级路由 路由别名 动态路由及重定向 四.自定义错误页面 五.图示路由系统在框架中的定位 六.路由系统的进阶想法 一.路由系统理 ...

  8. 采用dom4j和反射模拟Spring框架的依赖注入功能

    Spring的依赖注入是指将对象的创建权交给Spring框架,将对象所依赖的属性注入进来的行为.在学习了dom4j后,其实也可以利用dom4j和反射做一个小Demo模拟Spring框架的这种功能.下面 ...

  9. 剖析Asp.Net Web API路由系统---WebHost部署方式

    上一篇我们剖析了Asp.Net路由系统,今天我们再来简单剖析一下Asp.Net Web API以WebHost方式部署时,Asp.Net Web API的路由系统内部是怎样实现的.还是以一个简单实例开 ...

随机推荐

  1. 【转】OSI详解

    本文转自牛客网友CZ❤♡ღQM对在ISO/OSI参考模型中,网络层的主要功能是一题的回答. OSI ( Open System Interconnect ),即开放式系统互联. 一般都叫 OSI 参考 ...

  2. bzoj1052: [HAOI2007]覆盖问题(二分+构造)

    貌似又写出了常数挺优(至少不劣)的代码>v< 930+人AC #49 写了个O(nlogn)貌似比一些人O(n)还快2333333 这题还是先二分答案,check比较麻烦 显然正方形一定以 ...

  3. YBT 5.1 区间类动态规划

    题解在代码中 石子合并[loj 10147] /* dp[i][j]=max or min(dp[i][j],dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]) i<=k& ...

  4. 【learning】杜教筛求欧拉函数前缀和

    我们考虑利用\(\sum\limits_{d|n}\varphi(d)=n\)这一性质来处理这个问题 设\(f(n)=\sum\limits_{i=1}^{n}\varphi(i)\) 那么我们可以得 ...

  5. Poco::File

    基于入门的环境及makefile. #include<iostream> #include<Poco/File.h> using namespace std; using na ...

  6. unix awk手册读书笔记

    http://note.youdao.com/noteshare?id=9ac76eb63a53ac000f7814454642d2b0

  7. maven工程pom.xml报Missing artifact net.sf.jasperreports:jasperreports:jar:6.2.0

    有时maven工程的pom.xml报以下类型错误: Description Resource Path Location TypeMissing artifact net.sf.jasperrepor ...

  8. android之解析json数据格式详解

    1.JSON解析     (1).解析Object之一: view sourceprint? 1 {"url":"http://www.cnblogs.com/qianx ...

  9. (第三章,第四章)http报文内的http信息,返回结果的http状态码

    第三章 http报文内的http信息 用于http协议交互的信息被称为http报文,包括请求报文和响应报文. 1.编码提升传输速率,在传输时编码能有效的处理大量的访问请求.但是编码的操作是计算机完成的 ...

  10. 【BZOJ4837】LRU算法 [模拟]

    LRU算法 Time Limit: 6 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 小Q同学在学习操作系统中内存管理的 ...