在Python中动态创建对象

2 投票
2 回答
2440 浏览
提问于 2025-04-16 16:47

我该如何在运行时创建对象实例,使用Python呢?

假设我有两个类:

class MyClassA(object):
    def __init__(self, prop):
        self.prop = prop
        self.name = "CLASS A"

    def println(self):
        print self.name


class MyClassB(object):
    def __init__(self, prop):
        self.prop = prop
        self.name = "CLASS B"

    def println(self):
        print self.name

还有一个字典:

{('a': MyClassA), ('b': MyClassB)}

我该如何根据我选择的是'a'还是'b',动态地创建这两个类中的一个实例呢?

大概是这样的:

somefunc(str):
    if 'a': return new MyClassA
    if 'b': return new MyClassB

当我调用:somefunc('a').println时,能够得到“CLASS B”。

但我希望能以更优雅和动态的方式实现(比如说,我在运行时还可以往字典里添加更多的类)。

2 个回答

2

你可以通过调用一个类来创建它的实例。你的类字典 {('a': MyClassA), ('b': MyClassB)} 返回的是类,所以你只需要调用这个类就可以了:

classes['a']()

不过我感觉你想要的可能更具体一些。这里有一个 dict 的子类,当你用一个键去调用它时,它会查找相关的项目并调用它:

>>> class ClassMap(dict):
...     def __call__(self, key, *args, **kwargs):
...         return self.__getitem__(key)(*args, **kwargs)
... 
>>> c = ClassMap()
>>> c['a'] = A
>>> c['b'] = B
>>> c('a')
<__main__.A object at 0x1004cc7d0>
6

你可以创建一个调度器,这其实就是一个字典,里面的键对应着一些类。

dispatch = {
    "a": MyClassA,
    "b": MyClassB,
}

instance = dispatch[which_one]() # Notice the second pair of parens here!

撰写回答