Константы класса в 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