反射说简单点 --> 就是利用字符串的形式去对象(模块)中操作(寻找/检查/删除/设置)成员。
需求:由用户输入一个模块名,用户输入什么模块名,文件中就导入什么模块:
1:文件都在同一目录下的导入
在同一目录下建立两个文件,index.py , commons.py
commons.py文件内容如下:
def f1():
return "F1"
def f2():
return 'f2'
在index.py文件中书写代码:
m = input('input module : ')
module = __import__(m)#module相当于import modulename as f形式中的别名
print(module.f1())
使用 __import__('模块名')的方式导入模块!为什么要使用这种方式导入模块,而不使用 import modulename方式导入呢?因为用户输入进来的都是字符串,而import modulename方式,modulename不是一个字符串!
此时执行index.py文件,就能正常导入模块,接收f1函数中的返回值:
需求:上面已经实现用户输入模块名就导入哪个模块,现在要求由用户再输入函数名,然后文件中就执行该模块中的对应的函数
m = input('input module : ')#用户输入模块名
f = input('input func name : ')#用户输入函数名 module = __import__(m)#导入用户输入的模块
func = getattr(module,f)#调用用户输入的函数 print(func())
如果commons模块与index.py文件不在同一目录的导入:假如commons.py文件在lib/commons.py下
module = __import__('lib.'+m,fromlist=True)#导入用户输入的模块
附录:
getattr(object,name) :获取指定模块中的指定成员
hasattr(object,name):判断指定模块中是否存在指定成员
delattr(object,name):删除指定模块中的指定成员!不影响原文件,只是在内存中删除
setattr(object,name,value):给指定模块增加一个成员!不影响原文件,只是在内存中增加