2011-03-18 60 views
30

我有一個創建從它的參數派生類的函數:如何動態設置類名?

def factory(BaseClass) : 
    class NewClass(BaseClass) : pass 
    return NewClass 

現在,當我用它來創建新的類,這些類都被命名爲相同的,實例看起來像他們具有相同的類型:

NewA = factory(ClassA) 
NewB = factory(ClassB) 
print type(NewA()) # <class __main__.NewClass> 
print type(NewB()) # <class __main__.NewClass> 

正確修復手動設置__name__屬性?

NewA.__name__ = 'NewA' 
print type(NewA()) # <class __main__.NewA> 

我還有什麼其他的事情需要設置嗎?

回答

34

是的,設置__name__是正確的做法;你不需要設置其他任何東西來調整類名。

例如:

def factory(BaseClass) : 
    class NewClass(BaseClass): pass 
    NewClass.__name__ = "factory_%s" % BaseClass.__name__ 
    return NewClass 

type錯誤的事情在這裏使用。它不允許您使用Python的普通類語法定義類,而是讓您手動設置每個類屬性。它用於手動創建類,例如。如果你有一個基類的數組,並且你想用它創建一個類(你不能用Python的類語法來做)。不要在這裏使用它。

7

使用具有三個參數的type()函數檢出。以下代碼創建一個新類「NewA」,其中object作爲基本類型,並且沒有初始屬性。

>>> type('NewA', (object,), {}) 
<class '__main__.NewA'> 
+0

如果NewClass中的類定義非常長,看起來有點笨重。我將不得不將所有的方法累加到一個字典中(我假設doc字符串也在那裏,在'__doc __'''下)。 – kiyo 2011-03-18 14:24:55

+0

還有,如果NewClass中的方法必須動態引用BaseClass的方法呢? – kiyo 2011-03-18 14:34:51

+0

'type'用於創建具有可變基本列表的類;這完全是錯誤的工具。 – 2011-03-18 14:40:55