您可以使用字符串实例化类吗?


问题内容

我正在使用构建器模式来分离一堆不同的配置可能性。基本上,我有一堆名为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>]