Python'da sınıf sabitleri


129

Python'da, bir sınıfın tüm alt sınıflarda ortak olacak bazı "sabitlere" (pratik olarak değişkenler) sahip olmasını istiyorum. Bunu kolay sözdizimi ile yapmanın bir yolu var mı? Şu anda kullanıyorum:

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

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

ve bunu yapmanın daha iyi bir yolu olup olmadığını veya "Hayvan" yazmak zorunda kalmadan yapmanın bir yolu olup olmadığını merak ediyorum. boyutlardan önce. Teşekkürler! düzenleme: atın hayvandan miras aldığını söylemeyi unuttum.


16
Tam bir cevap değil SIZES, ancak hiç değişmezse, kesinlikle liste yerine bir demet kullanın. Öyle gibi("Huge","Big","Medium","Small")
jamylak

Görünüşe göre burada gerçekten bir numaralandırma peşindesiniz
Eric

Yanıtlar:


143

Yana Horsebir alt sınıfı olan Animal, sadece değiştirebilir

print(Animal.SIZES[1])

ile

print(self.SIZES[1])

Yine de, bunun SIZES[1]"büyük" anlamına geldiğini hatırlamanız gerekir , bu nedenle muhtemelen aşağıdaki gibi bir şey yaparak kodunuzu geliştirebilirsiniz:

class Animal:
    SIZE_HUGE="Huge"
    SIZE_BIG="Big"
    SIZE_MEDIUM="Medium"
    SIZE_SMALL="Small"

class Horse(Animal):
    def printSize(self):
        print(self.SIZE_BIG)

Alternatif olarak, ara sınıflar oluşturabilir: HugeAnimal, BigAnimal, ve bu kadar. Her hayvan sınıfı farklı bir mantık içerecekse, bu özellikle yararlı olacaktır.


SIZE_BIG = ["BigOne", "BigTwo"] bu tür bir sabit kullanmalıyım.
Lova Chittumuri

18

Sen alabilirsiniz SIZESvasıtasıyla self.SIZES(bir örnek yöntemi) veya cls.SIZES(a sınıfı yönteminde).

Her durumda, nerede bulacağınız konusunda açık olmanız gerekecek SIZES. Bir alternatif, SIZESsınıfları içeren modüle koymaktır , ancak daha sonra tüm sınıfları tek bir modülde tanımlamanız gerekir.


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

@betabandido: OP soruyu düzeltti. Cevabı buna göre güncelleyecektir.
Fred Foo

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

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

Ayrıca self, ex. "self.HUGE" veya "self.BIG". Bu yalnızca sınıf içinde dahili olarak işe yarar.
cevaris

4

Betabandido'nun cevabını genişleterek, öznitelikleri sabitler olarak modüle enjekte etmek için bir işlev yazabilirsiniz:

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

print SIZE_BIGsınıf dışı aynı mı olacak? Düzenlenebilir Animal.SIZE_HUGE = 'Small'mi olacak ?
Crusader
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.