Константы класса в python

В python я хочу, чтобы класс имел некоторые "константы" (практически, переменные), которые будут распространены во всех подклассах. Есть ли способ сделать это с дружественным синтаксисом? Сейчас я использую:

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

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

и мне интересно, есть ли лучший способ сделать это или способ сделать это, не записывая "Animal". до размеров. Благодарю! edit: забыл упомянуть, что лошадь наследуется от животного.

Ответ 1

Так как Horse является подклассом Animal, вы можете просто изменить

print(Animal.SIZES[1])

с

print(self.SIZES[1])

Тем не менее, вам нужно помнить, что SIZES[1] означает "большой", поэтому, возможно, вы могли бы улучшить свой код, выполнив что-то вроде:

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

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

В качестве альтернативы вы можете создавать промежуточные классы: HugeAnimal, BigAnimal и т.д. Это было бы особенно полезно, если каждый класс животных будет содержать различную логику.

Ответ 2

Вы можете перейти к SIZES с помощью self.SIZES (в методе экземпляра) или cls.SIZES (в методе класса).

В любом случае вам нужно будет указать, где найти SIZES. Альтернативой является размещение SIZES в модуле, содержащем классы, но тогда вам нужно определить все классы в одном модуле.

Ответ 3

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

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

Ответ 4

Расширяясь при ответе на betabandido, вы можете написать функцию для вставки атрибутов в константы в модуль:

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