反射:根据字符串的形式去对象中操作其成员。
1,通过字符串的形式,导入模块
commons.py
def f1():
print 'f1'
def f2():
print 'f2'
def f3():
print 'f3'
index.py
#根据用户输入的内容导入模块``
inp=raw_input('请输入模块:')
print(inp,type(inp))
com=__import__(inp)
com.f1()
#输入:commons
#结果:('commons', )
# f1
这段代码的功能就是通过字符串的形式导入模块,其中最重要的就是内置import方法,我们传入的’commons‘赋值给inp,通过import方法,此时com可以视为import commons,此时执行f1就可以得到结果。
另外:import可以导入嵌套的模块,比如一个文件lib中含有test,test中含有comnons模块。这里我们可以通:`
impor lib.test.commons
from lib.test import commons
#用__import__方式,有多级目录时fromlist=True:
r=__import__('lib.test.commons', fromlist=True)
2,通过字符串的形式,调用模块中指定的函数
index.py
inp=input('请输入模块:')
com=__import__(inp)
inp_func=raw_input('请输入要执行的函数:')
target_func=getattr(com,inp_func)`
result=target_func()
#输入:commons
#输入:f1
#输出:f1
通过getattr,可以进入com模块中寻找inp_func函数,当然不仅限于函数,模块中的对象都可以,例如commons中的全局变量。
hasattr,根据字符串的形式去模块中判断对象是否存在。
index.py
inp=input('请输入模块:')
com=__import__(inp)
inp_func=raw_input('请输入要执行的函数:')
target_func=hasattr(com,inp_func)`
print target_func
#输入:commons
#输入:s
#输出:False
setattr,可以通过字符串的形式进行设置。
r=hasattr(commons,'AGE')
print r
setattr(commons,'AGE',18)
r=hasattr(commons,'AGE')
print r
#False
#True
delattr可以删除模块中的对象。
总结:import 用字符串的形式导入模块;getattr以字符串的形式去某个模块中寻找函数,加上()表示执行函数;hasattr可以判断某个对象中是否有某个成员;serattr可以设置某个对象中的成员;delattr可以删除某个对象中的成员。