Python高手之路【十】python基础之反射

反射说简单点 --> 就是利用字符串的形式去对象(模块)中操作(寻找/检查/删除/设置)成员。

 

需求:由用户输入一个模块名,用户输入什么模块名,文件中就导入什么模块:

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):给指定模块增加一个成员!不影响原文件,只是在内存中增加

 

原文地址:https://www.cnblogs.com/ginvip/p/6263028.html