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

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

class Animal: SIZES=["Huge","Big","Medium","Small"] class Horse(Animal): def printSize(self): print(Animal.SIZES[1]) 

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

4 Solutions collect form web for “Константы класса в python”

Поскольку 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 и т. Д. Это было бы особенно полезно, если бы каждый класс животных содержал бы разную логику.

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

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

 class Animal: HUGE = "Huge" BIG = "Big" class Horse: def printSize(self): print(Animal.HUGE) 

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

 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 
  • Установите текущий каталог при запуске SimpleHTTPServer
  • Каков хороший способ найти относительные пути в Google App Engine?
  • Что такое оператор верхнего уровня в Python?
  • Функция join () в Python 3 поддерживает только строки?
  • Python конденсируется, если / else в одну строку?
  • Есть ли более сжатый / pythonic способ сделать это? (считая самый длинный ряд головок, хвостов в переворотах монет)
  • unboundLocalError: локальная переменная 'arm', указанная перед назначением?
  • Почему я получаю следующую ошибку в Python «ImportError: Нет модуля с именем py»?
  • Python - лучший язык программирования в мире.