引用:
https://www.cnblogs.com/vipchenwei/p/6991209.html
https://www.cnblogs.com/vipchenwei/p/6991209.html
1.反射是什么:
反射就是通过字符串的形式,导入模块;通过字符串的形式,去模块寻找指定函数,并执行。利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动!
2.python反射中的内置函数:
- getattr(object, name, [dafult value])
- hasattr(object, name):
说明:判断对象object是否包含名为name的特性(hasattr是通过调用getattr(ojbect, name)是否抛出异常来实现的) - setattr(object, name, value)
- delattr(object, name)
3.dir()说明:
If called without an argument, return the names in the current scope. Else, return an alphabetized list of names comprising (some of) the attributes of the given object, and of attributes reachable from it. If the object supplies a method named __dir__, it will be used; otherwise the default dir() logic is used and returns: for a module object: the module's attributes. for a class object: its attributes, and recursively the attributes of its bases. for any other object: its attributes, its class's attributes, and recursively the attributes of its class's base classes.
4.反射应用:
import test as ss ss.f1() ss.f2() print(ss.a)我们要导入另外一个模块,可以使用import.现在有这样的需求,我动态输入一个模块名,可以随时访问到导入模块中的方法或者变量,怎么做呢?
imp = input(“请输入你想导入的模块名:”) CC = __import__(imp) 這种方式就是通过输入字符串导入你所想导入的模块 CC.f1() # 执行模块中的f1方法上面我们实现了动态输入模块名,从而使我们能够输入模块名并且执行里面的函数。但是上面有一个缺点,那就是执行的函数被固定了。那么,我们能不能改进一下,动态输入函数名,并且来执行呢?
#dynamic.py imp = input("请输入模块:") dd = __import__(imp) # 等价于import imp inp_func = input("请输入要执行的函数:") f = getattr(dd,inp_func,None)#作用:从导入模块中找到你需要调用的函数inp_func,然后返回一个该函数的引用.没有找到就烦会None f() # 执行该函数上面我们就实现了,动态导入一个模块,并且动态输入函数名然后执行相应功能。
当然,上面还存在一点点小问题:那就是我的模块名有可能不是在本级目录中存放着。有可能是如下图存放方式:
那么这种方式我们该如何搞定呢?看下面代码:
dd = __import__("lib.text.commons") #这样仅仅导入了lib模块 dd = __import__("lib.text.commons",fromlist = True) #改用这种方式就能导入成功 # 等价于import config inp_func = input("请输入要执行的函数:") f = getattr(dd,inp_func) f() 标签:__,反射,--,object,python,导入,模块,attributes,import From: https://www.cnblogs.com/nick-qiu/p/17601685.html