0

我想保留我的自定义类的字典,以便我可以从其他字典(从 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'])

接受任何建议。

4

2 回答 2

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
于 2012-12-24T04:51:41.500 回答
2

我会从同一个基类继承它们,然后请求__subclasses__()那个类,一旦我确定它们都完成了。也许形式:

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

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

此外,如果它们没有足够的共同点来让这个超类看起来很有必要,那么在构建后以任何不混淆的方式在相同的代码中使用它们可能会遇到麻烦。

于 2014-09-01T22:44:14.840 回答