反射
1.反射 是通过字符串的形式操作对象相关的成员。一切事物都是对象!!!
根据字符串的形式取对象(某个模块)操作成员
2通过字符串导入模块
a = __import__("模块名") a = __import__('lib.test.com', fromlist=True)
通过字符串的形式,去模块中寻找指定的函数, 并执行
a = __import__("模块名") 用于以字符串的形式导入模块 a = __import__('lib.test.com', fromlist=True) 导入嵌套几层的文件中的模块
inp = input('请输入模块:') print(inp,type(inp)) 查看模块的类型 xin = __import__(inp) 用于字符串形式导入模块 ss = xin.f1() 执行指定的函数 print(ss) cc = xin.f2() print(cc) dd = xin.f3() print(dd)
python中的反射功能是由以下四个内置函数提供:
getattr。 用于以字符串的形式去某个模块中寻找函数 在获取到的函数名后加() 表示执行函数
hasattr、根据字符串的形式去某个模块中判断东西是否存在
setattr、根据字符串的形式去某个模块中设置内容
delattr,根据字符串的形式去某个模块中删除某个内容
简单查看的方式:
class Foo(object): def __init__(self): self.name = 'yigeyagng' def func(self): return 'func' obj = Foo() # #### 检查是否含有成员 #### hasattr(obj, 'name') hasattr(obj, 'func') # #### 获取成员 #### getattr(obj, 'name') getattr(obj, 'func') # #### 设置成员 #### setattr(obj, 'age', 18) setattr(obj, 'show', lambda num: num + 1) # #### 删除成员 #### delattr(obj, 'name') delattr(obj, 'func')
另外一种方式:
inp = input('请输入模块:') inp_func = input('请输入执行的函数:') xx = __import__(inp) #通过以字符串的形式寻找模块 get = getattr(xx,inp_func) #用于以字符串的形式去某个模块中寻找函数 重新赋值 ss = get() #将get加上()就是执行函数 print(ss) import fan #导入模块 # cc = hasattr(fan,'XXX') #去模块中判断是否存在 print(cc) fan.f1() #执行模块中的 f1 函数 setattr(fan,'ZZZ',lambda a:a + 1) #去某个模块中设置内容 zz = hasattr(fan,'ZZZ') #之后再查看一下内容 print(zz) delattr(fan,'XXX') #模块中删除某个内容 vv = hasattr(fan,'XXX') #查看之后的内容 print(vv)
3,实例:基于反射实现类Web框架的路由系统
#############三种实现方式########## from xxx import count #复杂写法 url = input('请输入url:') #等待用户输入的模块名 if url.endswith('login'): #判断输入的是不是login结束的 r = count.login() #执行count模块的login函数 print(r) elif url.endswith('logout:'): r = count.logout print(r) elif url.endswith('lognb:'): r = count.lognb print(r) else: 否则都不是 print('404') 就输入404 #优化写法 url = input('请输入url:') inp = url.split('/')[-1] if hasattr(count,inp): sss = getattr(count,inp) r = sss() print(r) else: print('404') #再进一步优化 inp = input('请输入url:') sss,get = inp.split('/') m = __import__('xxx.'+sss,fromlist=True) if hasattr(m,get): get = getattr(m,get) r = get() print(r) else: print('404')