反射
__import__以字符串的形式导入模块
r= __import__('模块名') r=__import__('lib.test.com',fromlist=true) //导入多层级的模块用fromlist=true
getattr以字符串的形式去某个模块中寻找函数(可以是变量,也可以是函数)。
hasattr以字符串的形式去某个模块中判断东西是否存在。
setattr以字符串的形式去某个模块中设置变量或函数
delattr以字符串的形式去某个模块中删除变量或函数
以字符串的形式去对象(某个模块)中操作成员
commons.py
def F1(): print('F1')
test.py
r = __import__('commons') //__import__以字符串的形式导入模块 r.F1()
以上代码执行结果:
F1
通过字符串的形式,去模块中寻找指定函数,并执行。
commons.py
def F1(): print('F1')
test.py
r = __import__('commons') func=getattr(r,'F1') //getattr以字符串的形式去某个模块中寻找函数,这里的F1可以是变量,也可以是函数。 func() //在获取到的函数名后加()表示执行函数
以上代码执行结果
F1
test.py
r = __import__('commons') val = hasattr(r,'age') print(val) setattr(r,'age',18) val = hasattr(r,'age') print(val) delattr(r,'age') val = hasattr(r,'age') print(val)
以上代码执行结果
False
True
False
利用反射查看面向对象成员属性
实例一:
class Foo:
def __init__(self, n):
self.name = n
def show(self):
print('we')
# 反射
# 反射:类,只能找类里的成员
# r = hasattr(Foo, 'show')
# print(r)
# 反射:对象,可以找对象里的成员和类里的成员
obj = Foo('zhou')
r = hasattr(obj, 'name')
print(r)
r = hasattr(obj, 'show')
print(r)
以上代码执行结果
True
True
经典用法:
基于反射实现类web框架的路由系统
manage.py
def login(): return 'login' def logout(): return 'logout' def nb(): return 'nb'
index.py
url = input('输入url:') target_model,target_func = url.split('/') m = __import__('lib.'+target_model, fromlist=True) if hasattr(m,target_func): re = getattr(m,target_func)() print(re) else: print('404')
运行index.py,输入account/login后运行结果:
login