如何定义一个以某种方式派生自int、具有自定义起始值并添加自定义属性的 Python 枚举类?我知道如何从int使用中导出enum.IntEnum并设置起始值,
Goo = enum.IntEnum("Goo", "MOO FOO LOO", start = 42)
Run Code Online (Sandbox Code Playgroud)
以及如何将自定义属性添加到基本枚举类型,
class Goo(enum.Enum):
MOO = (42, "forty-two")
FOO = (43, "forty-three")
LOO = (44, "forty-four")
def __init__(self, value, alias):
self._value = value #self.value gives AttributeError, as expected, grrr...
self.alias = alias
Run Code Online (Sandbox Code Playgroud)
但我该如何做到这三个呢?__new__()我也尝试过各种办法
class Goo(int, enum.Enum):
MOO = (42, "forty-two")
FOO = (43, "forty-three")
LOO = (44, "forty-four")
def __new__(cls, value, alias):
self = super().__new__(cls, value)
self.alias = alias
return self
Run Code Online (Sandbox Code Playgroud)
大多有奇怪的错误,
TypeError: int() takes at most 2 arguments (3 given)
Run Code Online (Sandbox Code Playgroud)
在这种情况下。谢谢。
吉姆
您想要的行为在 stdlib 中尚不可用Enum。您可以使用以下方法itertools.count()获取数字:
from enum import IntEnum
from itertools import count
_goo_count = count(42)
class Goo(IntEnum):
#
MOO = "forty-two"
FOO = "forty-three"
LOO = "forty-four"
#
def __new__(cls, alias):
value = next(_goo_count)
member = int.__new__(cls, value)
member._value_ = value
member.alias = alias
return member
Run Code Online (Sandbox Code Playgroud)
或者你可以使用aenum:
from aenum import IntEnum
class Goo(IntEnum):
_start_ = 42
_init_ = 'alias'
#
MOO = "forty-two"
FOO = "forty-three"
LOO = "forty-four"
Run Code Online (Sandbox Code Playgroud)
不管怎样,在使用中它看起来像:
>>> Goo.MOO
<Goo.MOO: 42>
>>> Goo.MOO.alias
'forty-two'
>>> Goo.MOO == 42
True
Run Code Online (Sandbox Code Playgroud)
一些风格注释:
你不需要括号来定义元组
空白很好;-)
声明:我是Python stdlibEnum、enum34backport和Advanced Enumeration ( aenum)库的作者 。