您可以使用字符串实例化类吗?
问题内容:
我正在使用构建器模式来分离一堆不同的配置可能性。基本上,我有一堆名为ID的类(类似于ID12345)。这些都继承自基本构建器类。在我的脚本中,每次该应用运行时,我需要为每个类实例化一个实例(大约50个)。因此,我尝试查看是否要执行以下操作:
ProcessDirector = ProcessDirector()
ID12345 = ID12345()
ID01234 = ID01234()
ProcessDirector.construct(ID12345)
ProcessDirector.construct(ID01234)
ID12345.run()
ID01234.run()
我可以做这样的事情吗(我知道这行不通):
IDS = ["ID12345", "ID01234"]
ProcessDirector = ProcessDirector()
for id in IDS:
builder = id() #some how instantiate class from string
ProcessDirector.construct(builder)
builder.run()
这样,当我将来需要添加一个新ID时,我要做的就是将ID添加到IDS列表中,而不是在整个代码中添加新ID。
编辑
看起来根据数据的来源有一些不同的意见。这些ID被输入到其他任何人都无法访问的文件中。我不是从命令行读取字符串,以后希望在添加新ID时进行很少的更改。
问题答案:
不确定这是否是您想要的,但是似乎更Python化的方式来实例化字符串中列出的一堆类:
class idClasses:
class ID12345:pass
class ID01234:pass
# could also be: import idClasses
class ProcessDirector:
def __init__(self):
self.allClasses = []
def construct(self, builderName):
targetClass = getattr(idClasses, builderName)
instance = targetClass()
self.allClasses.append(instance)
IDS = ["ID12345", "ID01234"]
director = ProcessDirector()
for id in IDS:
director.construct(id)
print director.allClasses
# [<__main__.ID12345 instance at 0x7d850>, <__main__.ID01234 instance at 0x7d918>]