如何在Python 3枚举类中定义一个不是枚举值的属性?

时间:2015-10-08 06:42:48

标签: python python-3.x enums

如何在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移出(但不是全局范围,只是类范围),那么我会遇到我在这里问的问题。

2 个答案:

答案 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>]