反射就是根据提供的字符串,匹配对象(类、模块等)里面的方法。达到动态调用的目的。
主要有四个成员。getattr、hasattr、setattr、delattr 获取成员、检查成员、设置成员、删除成员
语法:
getattr(对象,字符串)
setattr(对象,字符串,val)
hasattr(对象,字符串)
delattr(对象,字符串)
'''一个简单的例子'''
# 定义一个symbol类,有a,b,c三个方法。
class Symbol(object):
def a():
pass
def b():
pass
def c():
pass
# 输入方法名,执行对应方法。
S = Symbol()
method = input('input method name:').strip()
if hasattr(Symbol,method): # 判断是否存在输入的方法名
getattr(Symbol,method) # 如果存在则运行方法
else:
print("Error!Not Found!")
下面是使用__import__导入模块的例子:
相同目录导入
import commons
__import__('commons')
多层目录导入
from list.text import commons
__import__(' list.text.commons',fromlist=True) #如果不加上fromlist=True,只会导入list目录
而在使用的时候也可以动态输入模块名!
def main():
imp = input('input model name:') # 输入模块名
med = input('input method name:') # 输入方法名
print(imp ,med )
try:
obj = __import__(imp ) #导入该模块
print(obj)
if hasattr(obj,med): #判断有没有这个方法
fuc = getattr(obj,med) #获得这个方法
fuc()
else:
print('Error not found method!')
except:
print('Error not found model!')
if __name__ == '__main__':
main()
官方建议使用标准库importlib
import importlib
lib = importlib.import_moudle("lib\func") #lib\func是模块路径