В Python 3.4 представлен новый модуль enum
, который добавляет перечисленный тип к языку. Документация для enum.Enum
предоставляет пример, чтобы продемонстрировать, как она может быть расширена:
>>> class Planet(Enum):
... MERCURY = (3.303e+23, 2.4397e6)
... VENUS = (4.869e+24, 6.0518e6)
... EARTH = (5.976e+24, 6.37814e6)
... MARS = (6.421e+23, 3.3972e6)
... JUPITER = (1.9e+27, 7.1492e7)
... SATURN = (5.688e+26, 6.0268e7)
... URANUS = (8.686e+25, 2.5559e7)
... NEPTUNE = (1.024e+26, 2.4746e7)
... def __init__(self, mass, radius):
... self.mass = mass # in kilograms
... self.radius = radius # in meters
... @property
... def surface_gravity(self):
... # universal gravitational constant (m3 kg-1 s-2)
... G = 6.67300E-11
... return G * self.mass / (self.radius * self.radius)
...
>>> Planet.EARTH.value
(5.976e+24, 6378140.0)
>>> Planet.EARTH.surface_gravity
9.802652743337129
В этом примере также показана проблема с enum
: в методе свойства surface_gravity()
определена константа G
, которая обычно определяется на уровне класса, но попытка сделать это внутри enum
будет просто добавьте его как один из членов перечисления, поэтому вместо этого он определен внутри метода.
Если класс хотел использовать эту константу в других методах, ее также нужно было бы определить, что, очевидно, не идеально.
Есть ли способ определить константу класса внутри enum
или какой-нибудь обходной путь для достижения того же эффекта?