通过字符串来生成指定的对象不仅是一种很酷的做法,也是非常实用的方法,能极大的提高系统的灵活性和可维护性。在Python中,我们也可以使用这样的方法。
为实现这个目标,在Python中,我们主要用到了importlib包中的 import_module 函数,通过这个函数,我们获取了模块的定义,包括模块中包含那些类,函数等,然后我们在通过内置的函数 getattr , 获取了模块中指定名称的类的定义(当然,也可以获取函数),最后通过类的定义来构造具体的对象实例。 用代码来说明:
核心代码,通过字符串生成对象实例
1 | def buildInstance(moduleName, className): |
假设我们定义了一个如下的package: DataInput
1 | DataInput |
在package中有一个Core模块,在Core模块中有一个GenericInput类。代码如下:
1 | class GenericInput(): |
我们想要动态生成GenericInput的实例并调用getData方法,就可以用如下的代码:
1 | import importlib |
注意: 我们在调用程序里并没有使用import语句导入DataInput.Core模块,而只是导入了系统内置的模块: importlib
有了这个基础,我们就可以进一步把模块名,类名等信息更加需要放置在配置文件或数据库中,形成一个可配置的,灵活的系统。