簡體   English   中英

如何動態設置類名?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM