[英]How to set class names dynamically?
我有一個函數創建從它的參數派生的類:
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>
我在做什么時還應該設置其他東西嗎?
是的,設置__name__
是正確的做法; 你不需要設置其他任何東西來調整類名。
例如:
def factory(BaseClass) :
class NewClass(BaseClass): pass
NewClass.__name__ = "factory_%s" % BaseClass.__name__
return NewClass
在這里使用type
是錯誤的。 它不允許您使用Python的普通類語法定義類,而是讓您手動設置每個類屬性。 它用於手動創建類,例如,如果你有一個基類數組,並且你想用它創建一個類(你不能用Python的類語法)。 不要在這里使用它。
使用帶有三個參數的type()
函數簽出。 以下代碼創建一個新類“NewA”,其中object
為基類型,沒有初始屬性。
>>> type('NewA', (object,), {})
<class '__main__.NewA'>
更新Glenn Maynard的答案:現在有__name__
屬性和__qualname__
屬性。 首先是你可能會想到的; 第二個是嵌套類的虛線“路徑”。
在“簡單”類的情況下,兩者都是相同的。 只需將__name__
和__qualname__
設置為新名稱即可。 您應該設置這兩個屬性,因為您無法確定哪個第三方代碼看起來像。
現在對於嵌套類,兩個屬性之間的差異顯示:
class Outer:
class Inner:
pass
print(Outer.__name__, Outer.__qualname__)
print(Outer.Inner.__name__, Outer.Inner.__qualname__)
打印:
Outer Outer
Inner Outer.Inner
如果你想改變Outer
的名字,你需要修補三個地方,即Outer.__name__
, Outer.__qualname__
, Inner.__qualname__
。 對於后兩者,您需要正確地分割和連接點。
最后的警告:即使你做的那么正確,像獅身人面像,幽靈等等......可能仍然不能100%工作。 例如,像往常一樣在模塊命名空間中找不到假名; 對於類定義,源不能是grep
ped; 等等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.