这篇博客记录下python中关于反射的知识点,同时结合实例看看其在动态导入中的应用。
什么是反射
反射(Reflect)是指面向对象编程中通过字符串动态获取对象的类型、属性和方法等信息。
反射使用场景
想象下面的场景,我们编写了几十个插件供业务程序来使用,而具体业务中使用哪些插件是由配置文件来控制的,或者由用户输入的。不管是配置文件还是用户输入,都是采用字符串形式来表示插件名,我们需要检查字符串代表的插件名是否存在,如果存在需要获取对应的插件对象并调用。
文字表述不太直观,看如下的一个项目
在plugins
模块中有两个插件,分别是plugin1
和plugin2
,
# plugin1
class Calc1:
def process(self):
print('class name is {}'.format(self.__class__.__name__))
# plugin2
class Calc2:
def process(self):
print('class name is {}'.format(self.__class__.__name__))
并在__init__.py
中进行了导入
from plugins import plugin1, plugin2