36、python的反射:
实例:伪造一个web框架的路由系统
1、利用字符串的形式取对象(模块)中操作(寻找,删除,检查,设置)成员,getattr()和hasattr()的使用:
commons.py
#!/usr/bin/env python
# _*_ coding:utf-8 _*_
def login():
print('登陆页面')
def logout():
print('退出页面')
def home():
print('主页面')
# _*_ coding:utf-8 _*_
def login():
print('登陆页面')
def logout():
print('退出页面')
def home():
print('主页面')
index.py
import commons
def run():
inp = input('请输入要访问的url:')
if hasattr(commons,inp):
func = getattr(commons,inp)
func()
else:
print('404')
if __name__ == '__main__':
def run():
inp = input('请输入要访问的url:')
if hasattr(commons,inp):
func = getattr(commons,inp)
func()
else:
print('404')
if __name__ == '__main__':
run()
2、delatttr()和setattr()只是删除和设置加载到内存中的模块,而实际没有改变原模块中的内容.
3、导入模块的反射:
#1:__import__(str)的应用:obj = __import__(str) 导入的时候:obj.attribute
#2:__import__('xx.oo.yy',fromlist=True)表示导入xx目录下的oo目录下的yy模块。
def run():
inp = input('请输入要访问的url:')
m,f = inp.split('/')
obj = __import__(m)
if hasattr(obj,f):
func = getattr(obj,f)
func()
else:
print('404')
if __name__ == '__main__':
run()