2012-12-24 113 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做記賬。另外,如果他們沒有足夠的共同性來讓這個超類看起來有保證,那麼在建造之後,你可能會在使用相同的代碼時遇到問題,而且不會造成混淆。