我想保留自定义类的字典,以便我可以从其他字典动态实例化它们(从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'])
对任何建议持开放态度。
答案 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进行簿记。
另外,如果他们没有足够的共同点来让这个超类看起来有保证,你可能会在构造之后以相同的代码以任何不混淆的方式使用它们。