Python

2010-03-30 12 views
8

'da söz konusu sınıfın içinde bir sınıfın statik örneklerini oluşturun Burada terminolojiyi yanlış anlamış olursam özür dilerim - bu özel deyimin ne olacağını düşünemiyorum.Python

Kendisinin içinde kendi örneklerini statik olarak bildiren bir Python 3 sınıfı oluşturmaya çalışıyorum — enum gibi çalışırdı. İşte yazdım kod basitleştirilmiş versiyonu:

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)) 

bu Yazma, ben çizgi 2 (A = Test("A")) üzerinde bir istisna var. Eğer bu kadar ileri gitmiş olsaydı hat 3'ün de hata yapacağını düşünürdüm. Test yerine __class__ kullanılması aynı hatayı verir.

Geçerli sınıfa statik bir bağlamda Python'da başvurmanın bir yolu var mı? Bu değişkenleri sınıfın dışında ya da ayrı bir sınıfta ilan edebilirim, fakat açıklık için, yardımcı olabilirmemi tercih ederim.

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); 
    } 
} 

Bu beklediğiniz gibi çalışır:

daha iyi yapmaya çalıştığım şey bu göstermek için burada Java aynı örnek o yazdırır:

Test: A 
Test: B 

nasıl yapabilirim Python'da aynı şey?

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

Python A sınıfı da diğerleri gibi bir nesnedir ve herhangi bir zamanda yeni değişkenler ekleyebilirsiniz: Sınıfa tanımlı sonra

cevap

9

, şu iki satırı ekleyin. Bu süre içinde tanımlanmadığı için sınıf içinde yapamazsınız (yalnızca sınıfın doğru şekilde ayrıştırılmasından sonra sembol tablosuna eklenecektir).

+0

inanıyoruz. Yardımlarınız için çok teşekkürler. –

2

Python'da, class bloğu yalnızca bir bildirim değildir; Dersi kurmak için çalışma zamanında yürütülür. Sınıf içindeki her bir def, bir işlev oluşturur ve adı sınıfın ad alanına bağlar. Bu nedenle, A = MyClass() doğrudan sınıf bloğu içinde yapamazsınız, çünkü MyClass() sınıf bloğu kapanana kadar tam olarak tanımlanmamıştır. İşte bunu nasıl açıklanmıştır:

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

Aaron'ın cevabı da metaclasses kullanabilirsiniz tercih edilen yoldur iken: Ben görmedim

ders Yapamam Of
>>> 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

Çok havalı. Meta sınıfları daha önce oynamamış olduğum bir şey. Bir noktada onları denemek zorundayım. –