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
中定义一个类常量,或者一些解决方法来达到同样的效果?
原文由 Zero Piraeus 发布,翻译遵循 CC BY-SA 4.0 许可协议
这是高级行为,在创建的 90% 以上的枚举中不需要。
根据文档:
所以如果你想要一个类常量,你有几个选择:
__init__
中创建它descriptor
在
__init__
中创建常量并在创建类之后添加它,这两种情况都没有将所有类信息收集在一个地方。Mixins 当然可以在适当的时候使用( 请参阅 dnozay 的回答以获得一个很好的例子),但这种情况也可以通过具有内置实际常量的基础
Enum
类来简化。首先,将在以下示例中使用的常量:
以及一次性使用的枚举示例:
最后,多用途枚举示例:
注意:
Constant
G
真的不是。可以将G
重新绑定到其他东西:如果你真的需要它是常量(又名不可重新绑定),那么使用 新的 aenum 库[1],它将阻止重新分配
constant
s 以及Enum
成员的尝试。1披露:我是 Python stdlib
Enum
、enum34
backport 和 高级枚举(aenum
库) 的作者