2012-05-20 19 views
66

Python'da, bir sınıfın tüm alt sınıflarda yaygın olacak bazı "sabitler" (pratik olarak, değişkenler) olmasını istiyorum. Dostu sözdizimi ile bunu yapmak için bir yolu var mı?Python'da sınıf sabitleri

class Animal: 
    SIZES=["Huge","Big","Medium","Small"] 

class Horse(Animal): 
    def printSize(self): 
     print(Animal.SIZES[1]) 

ve bunu yapmak için daha iyi bir yolu veya daha sonra yazmak zorunda kalmadan bunu yapmanın bir yolu var olup olmadığını merak ediyorum: Şu anda kullandığım "Hayvan". boyutlardan önce. Teşekkürler! düzenleme: atın hayvandan miras kaldığını belirtmeyi unutmuşum.

+9

değil tam cevap ama SIZES' asla değişmez ', kesinlikle bir liste yerine bir demet kullanmak . Öyle ki ("Büyük", "Büyük", "Orta", "Küçük") – jamylak

+0

Burada bir numaradan sonra gerçekten gözüküyorsun – Eric

cevap

12

self.SIZES (bir örnek yönteminde) veya cls.SIZES (bir sınıf yönteminde) aracılığıyla SIZES'a ulaşabilirsiniz.

Her durumda, SIZES'u nerede bulacağınız konusunda açık olmak zorundasınız. Bir alternatif, sınıfları içeren modülde SIZES'u koymaktır, ancak tüm sınıfları tek bir modülde tanımlamanız gerekir. Horse yana

+0

At gerçekten Hayvanın bir alt sınıfıdır. Aslında, Animal.SIZES [1] yerine self.SIZES [1] kullanmak mükemmel bir şekilde mümkündür. – betabandido

+0

@betabandido: OP, soruyu düzeltti. Cevabı uygun şekilde günceller. –

6
class Animal: 
    HUGE = "Huge" 
    BIG = "Big" 

class Horse: 
    def printSize(self): 
     print(Animal.HUGE) 
+0

Ayrıca, self, ex. "self.HUGE" veya "self.BIG". Bu sadece sınıf içinde dahili olarak çalışırdı. – cevaris

82

Animal bir alt sınıfı, sadece Yine

print(self.SIZES[1]) 

ile

print(Animal.SIZES[1]) 

değiştirebilir olduğu, bunu muhtemelen size, SIZES[1] "büyük" anlamına geldiğini hatırlamanız gereken

gibi bir şey yaparak kodunuzu geliştirebilir

Alternatif olarak, orta sınıflar oluşturabilirsiniz: HugeAnimal, BigAnimal, vb. Bu, her bir hayvan sınıfının farklı mantık içereceği durumlarda özellikle yararlı olacaktır. betabandido cevabı üzerine genişletilmesi

2

, sen modüle sabitleri gibi nitelikleri enjekte etmek için bir fonksiyon yazabiliriz:

def module_register_class_constants(klass, attr_prefix): 
    globals().update(
     (name, getattr(klass, name)) for name in dir(klass) if name.startswith(attr_prefix) 
    ) 

class Animal(object): 
    SIZE_HUGE = "Huge" 
    SIZE_BIG = "Big" 

module_register_class_constants(Animal, "SIZE_") 

class Horse(Animal): 
    def printSize(self): 
     print SIZE_BIG 
+0

Baskı SIZE_BIG 'sınıfının dışında aynı olacak? Düzenlenebilir mi olacak? Animal.SIZE_HUGE = 'Küçük'? – Crusader