如何在Python 3枚举类中定义一个不是枚举值的属性?
class Color(Enum):
red = 0
blue = 1
violet = 2
foo = 'this is a regular attribute'
bar = 55 # this is also a regular attribute
但这对我来说似乎失败了。似乎Color尝试将foo和bar包含为其枚举值的一部分。
编辑: 以免你认为我没有按照预期的方式使用Enum ...例如,参考官方Python文档的示例枚举类Planet(docs.python.org/3/library/enum.html#planet)。请注意,它们在surface_gravity()方法中定义了引力常数G.但这是奇怪的代码。一个普通的程序员会说,在函数之外设置一次常数G.但是如果我试图将G移出(但不是全局范围,只是类范围),那么我会遇到我在这里问的问题。
答案 0 :(得分:3)
构建enum.Enum
类时,所有常规属性将成为枚举的成员。不同类型的价值没有区别。
通过常规属性,我指的是非描述符(如函数)和排除名称的所有对象(使用单个下划线名称,请参阅Allowed members and attributes of enumerations section)。
如果您需要最终enum.Enum
对象的其他属性,请在之后添加
class Color(Enum):
red = 0
blue = 1
violet = 2
Color.foo = 'this is a regular attribute'
Color.bar = 55
演示:
>>> from enum import Enum
>>> class Color(Enum):
... red = 0
... blue = 1
... violet = 2
...
>>> Color.foo = 'this is a regular attribute'
>>> Color.bar = 55
>>> Color.foo
'this is a regular attribute'
>>> Color.bar
55
>>> Color.red
<Color.red: 0>
>>> list(Color)
[<Color.red: 0>, <Color.blue: 1>, <Color.violet: 2>]
答案 1 :(得分:2)
Enum
类型的要点是定义枚举值,因此非枚举值理论上超出了此类型的范围。对于常量,你应该考虑将它们移出类型:它们可能与枚举值没有直接关系(而是一些基于那些的逻辑),也应该是类型的可变属性。通常,您只需在模块级别创建一个常量。
如果你真的需要某种类型的东西,那么你可以把它作为一个类方法添加:
class Color(Enum):
red = 0
blue = 1
violet = 2
bar = 55
@classmethod
def foo (cls):
return 'this is a not really an attribute…'
使用this answer中的classproperty
描述符,您还可以将其转换为类级别的属性,您可以像访问普通属性一样访问该属性:
class Color(enum.Enum):
red = 0
blue = 1
violet = 2
bar = 55
@classproperty
def foo (cls):
return 'this is a almost a real attribute'
>>> Color.foo
'this is a almost a real attribute'
>>> list(Color)
[<Color.red: 0>, <Color.blue: 1>, <Color.violet: 2>, <Color.bar: 55>]