Python从类列表中创建实例

时间:2012-12-24 04:48:52

标签: python class instantiation

我想保留自定义类的字典,以便我可以从其他字典动态实例化它们(从db加载),但我不确定要存储什么。

class_register = {}

class Foo(object):
    def __init__(self, **kwargs):
        class_register[self.__class__.__name__] = ??  # what to store here?
        self.__dict__.update(kwargs)

new_instance = class_register[result['class_name']](**result['data'])

对任何建议持开放态度。

2 个答案:

答案 0 :(得分:2)

只需存储类本身:

class_register[self.__class__.__name__] = self.__class__

但这有点矫枉过正,因为每次实例化时都会注册该类。

更好的是使用它:

def register(cls):
    class_register[cls.__name__] = cls

class Foo(object):
    # blah blah

register(Foo)

然后你可以把它变成一个类装饰器,就像这样使用:

def register(cls):
    class_register[cls.__name__] = cls
    return cls

@register
class Foo(object):
    # blah blah

答案 1 :(得分:2)

我会从相同的基类继承它们,然后在我确定它们全部完成后请求该类的__subclasses__()。也许是以下列形式:

 Base.class_register = dict((x.__name__, x) for x in Base.__subclasses__())

使用较少的魔法让Python进行簿记。

另外,如果他们没有足够的共同点来让这个超类看起来有保证,你可能会在构造之后以相同的代码以任何不混淆的方式使用它们。

相关问题