反射就是根据提供的字符串,匹配对象(类、模块等)里面的方法。达到动态调用的目的。
主要有四个成员。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是模块路径 |