一.反射:
1.通过字符串的形式导入模块
2.通过字符串的形式去模块中寻找指定函数,并执行
3.反射:
a.根据字符串的形式去某个模块中寻找东西, 函数:__import__, getattr
b.根据字符串的形式去某个模块中判断东西是否存在, 函数:hasattr
c.根据字符串的形式去某个模块中设置东西, 函数:setattr
d.根据字符串的形式去某个模块中删除东西, 函数:delattr
总结:反射是根据字符串形式去对象(某个模块)中操作其成员,一切事物皆对象!
#应用:根据用户输入的内容导入模块 inp = input('请输入模块名:') inp_func = input('请输入要执行的函数:') #__import__()用于以字符串的形式导入模块 dd = __import__(inp)#相当于import commons as dd target_func = getattr(dd,inp_func)#getattr用于以字符串的形式去某个模块中找函数 result = target_func()#获取到的函数后加()表示执行函数 print(result)
import commons target_func = getattr(commons, 'name',None)#None:没有name这个全局变量报空 print(target_func) # target_func()#如果是函数就执行 r = hasattr(commons, 'name')#判断没有的话返回False print(r) setattr(commons,'AGE',18)#设置全局变量 setattr(commons,'AGE',lambda a: a + 1)#设置内存里面函数,跟原文件没关系 r = hasattr(commons,'AGE') print(r) delattr(commons,'AGE')#删除内存里面的数据 r = hasattr(commons,'AGE') print(r)
a = __import__('lib.test.com',fromlist=True)#导入lib模块下面的test模块下面的com模块,必须带fromlist否则只能找到lib. 等同于:from lib.test import com
基于反射实现web框架的路由系统:
#根据输入url地址查找页面(根据后缀来找到页面),这种有多少url就要写多少判断 from lib import acccount url = input('请输入url:') if url.endswith('login'): r = acccount.login() print(r) elif url.endswith('logout'): r = acccount.login() print(r) else: print('404') #再定义lib文件夹下面的acccount模块 def login(): return 'login' def logout(): return 'logout'
#根据输入url地址查找页面(根据后缀来找到页面),这种用反射取的值判断只写一次就行 from lib import acccount url = input('请输入url:') inp = url.split('/')[-1]#分割取用户输入的最后一个 if hasattr(acccount,inp): target_func = getattr(acccount,inp) r = target_func() print(r) else: print('404') #再定义lib文件夹下面的acccount模块 def login(): return 'login' def logout(): return 'logout'
#根据模块名/函数名查找url(可以在多个模块里面找到url)终极版 url = input('请输入url:') targe_module, target_func = url.split('/')#模块名和函数名的格式 m = __import__('lib.' + targe_module, fromlist=True)#导入用户输入的模块 if hasattr(m, target_func): target_func = getattr(m,target_func) r = target_func() print(r) else: print('404')