三十八、python中反射介绍


一、反射:根据字符串的形式去对象(某个模块)中去操作成员
通过字符串的形式,导入模块
通过字符串的形式,去模块中寻找指定的函数,并执行

1.__import__:用于字符串的形似执行导入模块
  
inp=input("请输入模块名:")
#print(inp,type(inp))

#__import__用于字符串的形似执行导入模块
dd=__import__(inp)

2.getattr:用于字符串的形式去某个模块中寻找函数
 
imp=input("请输入执行的函数名称:")
#getattr 用于字符串的形式去某个模块中寻找函数
f=getattr(dd,imp,None)
#在获取到的函数名后加(),执行函数
#print(f,f())

3.
hasattr()根据字符串的形式去某个模块中判断东西是否存在
r=hasattr(dd,imp)
print(r)


4.setattr(obj,name,value):
根据字符串的形式去某个模块中设置东西(创建于内存中)
setattr(dd,'age',18)
r=hasattr(dd,imp)
print(r)
setattr(dd,'age',lambda a:a+1)
r=hasattr(dd,'age')
print(r)


5.delattr()
根据字符串的形式去某个模块中删除东西
delattr(dd,'age')
r=hasattr(dd,'age')
print(r)

6.导入其他包下的函数
#from lib.test import com
# print(com.f11())
z这种方式只能导入到lib
r=__import__('lib.test.com')
print(r)
<module 'lib' from 'F:\test-py3\Function\fanshe\lib\__init__.py'>
故选择这种方式

r=__import__('lib.test.com',fromlist=True)
print(r.f11())

二、一个包下的一个函数文件
from lib import account

url=input("请输入url:")
uri=url.split('/')[-1] #分割url以/
#print(uri)
if hasattr(account,uri):
func=getattr(account,uri)
r=func()
print(r)
else:
print('404')
三、多个模块下的多个函数(即基于web框架的路由器)

#格式:模块名/函数
uri=input("请输入url:")
url_module,url_func=uri.split('/')

m=__import__('lib.'+url_module,fromlist=True)
#print (m)
if hasattr(m,url_func):
r=getattr(m,url_func)
f=r()
print(f)
else:
print('404')