2012-12-24 92 views
0

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

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

您是否尝试过'self .__ class__'?我不太清楚为什么你需要这样做。你能解释一下你的情况吗? – Blender

+0

@Blender感谢您的询问......我只是将MongoDB数据转换为自定义Python对象,这样我就可以脱离字典!干杯。 – MFB

回答

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 
+0

感谢Ned,每当我实例化课程时,我都感到非常困扰。装饰者解决方案是完美的。圣诞节快乐! – MFB

2

我将继承他们从同一个基类,然后请求__subclasses__(),一旦我确定他们全部完成了。也许是这样的形式:

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

它使用更少的魔力让Python做记账。另外,如果他们没有足够的共同性来让这个超类看起来有保证,那么在建造之后,你可能会在使用相同的代码时遇到问题,而且不会造成混淆。