Python中通过字符串来生成指定的对象

通过字符串来生成指定的对象不仅是一种很酷的做法,也是非常实用的方法,能极大的提高系统的灵活性和可维护性。在Python中,我们也可以使用这样的方法。

为实现这个目标,在Python中,我们主要用到了importlib包中的 import_module 函数,通过这个函数,我们获取了模块的定义,包括模块中包含那些类,函数等,然后我们在通过内置的函数 getattr , 获取了模块中指定名称的类的定义(当然,也可以获取函数),最后通过类的定义来构造具体的对象实例。 用代码来说明:

核心代码,通过字符串生成对象实例

1
2
3
4
5
def buildInstance(moduleName, className):
inputModule = importlib.import_module(moduleName)
instanceCls = getattr(inputModule, className)
instance = instanceCls()
return instance

假设我们定义了一个如下的package: DataInput

1
2
3
DataInput
+ __init__.py
+ Core.py

在package中有一个Core模块,在Core模块中有一个GenericInput类。代码如下:

1
2
3
4
class GenericInput():

def getData(self):
return "Generic Input"

我们想要动态生成GenericInput的实例并调用getData方法,就可以用如下的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import importlib


def buildInstance(moduleName, className):
inputModule = importlib.import_module(moduleName)
instanceCls = getattr(inputModule, className)
instance = instanceCls()
return instance


if __name__ == "__main__":

dataInput = buildInstance("DataInput.Core", "GenericInput")
value = dataInput.getData()

print(value)

注意: 我们在调用程序里并没有使用import语句导入DataInput.Core模块,而只是导入了系统内置的模块: importlib

有了这个基础,我们就可以进一步把模块名,类名等信息更加需要放置在配置文件或数据库中,形成一个可配置的,灵活的系统。

本文标题:Python中通过字符串来生成指定的对象

文章作者:Morning Star

发布时间:2019年06月15日 - 18:06

最后更新:2021年04月16日 - 15:04

原始链接:https://www.mls-tech.info/python/python-dynamic-new-instance/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。