2010-03-30 198 views
8

如果我在這裏遇到了術語錯誤的道歉,我無法想象這個特定的習慣用法會被調用。在Python中的類中創建一個類的靜態實例

我一直在嘗試創建一個靜態聲明自身內部實例的Python 3類 - 有點像枚舉可以工作。下面是我寫的代碼的簡化版本:

class Test: 
    A = Test("A") 
    B = Test("B") 

    def __init__(self, value): 
     self.value = value 

    def __str__(self): 
     return "Test: " + self.value 

print(str(Test.A)) 
print(str(Test.B)) 

寫這本,我上線2(A = Test("A"))異常。我假設第3行也會出錯,如果它已經做到了這一點。使用__class__而不是Test給出了相同的錯誤。

File "<stdin>", line 1, in <module> 
    File "<stdin>", line 2, in Test 
NameError: name 'Test' is not defined 

有什麼辦法在Python的靜態上下文中引用當前類?我可以在類之外或者在一個單獨的類中聲明這些特定的變量,但爲了清楚起見,如果我能夠幫助它,我寧願不要。

爲了更好地說明什麼,我試圖做的,這裏是一個Java同樣的例子:

public class Test { 
    private static final Test A = new Test("A"); 
    private static final Test B = new Test("B"); 

    private final String value; 

    public Test(String value) { 
     this.value = value; 
    } 

    public String toString() { 
     return "Test: " + value; 
    } 

    public static void main(String[] args) { 
     System.out.println(A); 
     System.out.println(B); 
    } 
} 

這個工作你所期望的:它打印:

Test: A 
Test: B 

我該怎麼辦Python中的一樣東西?

回答

9

後您定義的類,只需添加以下兩行:

Test.A = Test("A") 
Test.B = Test("B") 

在Python類是像任何其他的對象,你可以隨時增加新的變數。你不能在類內部完成它,因爲它當時沒有定義(只有在類的整個代碼已被正確解析後,它纔會被添加到符號表中)。

+0

當然 - 不能相信我沒有看到這一點。非常感謝您的幫助。 – 2010-03-30 15:58:07

2

在Python中,class塊不僅僅是一個聲明;它在運行時被執行來構建類。類中的每個def都會構建一個函數並將該名稱綁定到該類的名稱空間中。出於這個原因,您不能直接在類塊中直接執行A = MyClass(),因爲MyClass()在類塊關閉之前沒有完全定義。以下是如何做到這一點:

class Test: 
    def __init__(self, value): 
     self.value = value 

    def __str__(self): 
     return "Test: " + self.value 

Test.A = Test("A") 
Test.B = Test("B") 
2

雖然阿龍的回答是首選的方式,您還可以使用元類:

>>> class TestMeta(type): 
... def __init__(cls, name, bases, dct): 
... cls.A = cls() 
... cls.B = cls() 
... 
>>> class Test: 
... __metaclass__ = TestMeta 
... 
>>> Test 
<class __main__.Test at 0x7f70f8799770> 
>>> Test.A 
<__main__.Test object at 0x7f70f86f2e10> 
>>> Test.B 
<__main__.Test object at 0x7f70f86f2e90> 
>>> 
+0

很酷。元類是我以前沒有玩過的東西。我必須在某個時候嘗試一下。 – 2010-03-30 16:09:15

相關問題