Python从类列表创建实例

Python从类列表创建实例,python,class,instantiation,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

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

欢迎任何建议。

只需存储类本身:

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

只需存储类本身:

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

我会从同一个基类继承它们,然后请求该类的
\uuu子类\uu()
,一旦我确定它们都完成了。或许以以下形式:

 Base.class_register = dict((x.__name__, x) for x in Base.__subclasses__())
它使用更少的魔法让Python记账


此外,如果它们没有足够的共同点来保证这个超类,那么在构建之后,您可能会在相同的代码中使用它们,而这不会让您感到困惑。

我会从相同的基类继承它们,然后请求该类的
\uuuu子类
,有一次我确信他们都完成了。或许以以下形式:

 Base.class_register = dict((x.__name__, x) for x in Base.__subclasses__())
它使用更少的魔法让Python记账


此外,如果它们没有足够的共同点来保证这个超类的正确性,那么在构建之后,在相同的代码中使用它们时可能会遇到麻烦,而且不会造成混淆。

您是否尝试过
self.\uuuuu class\uuuu
?我不太清楚你为什么要这么做。你能再解释一下你的情况吗?@Blender谢谢你的询问。。。我只是将MongoDB数据转换成自定义Python对象,这样我就可以离开dict land了!干杯。你试过self吗?我不太清楚你为什么要这么做。你能再解释一下你的情况吗?@Blender谢谢你的询问。。。我只是将MongoDB数据转换成自定义Python对象,这样我就可以离开dict land了!干杯。谢谢Ned,每次我实例化这个类的时候我都在注册,这让我很烦恼。装饰解决方案是完美的。圣诞快乐!谢谢Ned,每次实例化这个类的时候我都在注册,这让我很烦恼。装饰解决方案是完美的。圣诞快乐!