我有他的枚举:
class MultiAttr(Enum):
RED = (1, 10)
GREEN = (2, 20)
BLUE = (3, 20)
def __init__(self, id, val):
self.id = id
self.val = val
assert MultiAttr((2, 20)) == MultiAttr.GREEN
断言通过。
Argument missing for parameter "val"
?MultiAttr(2) == MultiAttr.GREEN
?__new__
,因为您想自定义 Enum 成员的实际值:
from enum import Enum
class MultiAttr(bytes, Enum):
def __new__(cls, value, otherVal):
obj = bytes.__new__(cls, [value])
obj._value_ = value
obj.otherVal = otherVal
return obj
RED = (1, 10)
GREEN = (2, 20)
BLUE = (3, 20)
print(MultiAttr(2) == MultiAttr.GREEN)
print(MultiAttr(2).otherVal)
出:
True
20
还有另一种方法可以为枚举成员存储附加值。 扩展枚举 - 有助于做到这一点
from dataclasses import dataclass
from extended_enum import BaseExtendedEnumValue, ExtendedEnum, EnumField
@dataclass(frozen=True)
class SomeExtendedEnumValue(BaseExtendedEnumValue):
other_value: int
class MultiAttr(ExtendedEnum):
RED = EnumField(SomeExtendedEnumValue(value=1, other_value=10))
GREEN = EnumField(SomeExtendedEnumValue(value=2, other_value=20))
BLUE = EnumField(SomeExtendedEnumValue(value=3, other_value=20))
>>> MultiAttr(SomeExtendedEnumValue(2, 20)) == MultiAttr.GREEN
True
>>> MultiAttr.GREEN.value
2
>>> MultiAttr.GREEN.extended_value
SomeExtendedEnumValue(value=2, other_value=20)
>>> MultiAttr.GREEN.extended_value.other_value
20
>>> MultiAttr(SomeExtendedEnumValue(2, 30)) == MultiAttr.GREEN
ValueError: SomeExtendedEnumValue(value=2, other_value=30) is not a valid MultiAttr
如果不需要比较
字段,可以使用other_value
。 在这种情况下,比较将在第一个字段上进行。field(compare=False)
from dataclasses import dataclass, field
@dataclass(frozen=True)
class SomeExtendedEnumValue(BaseExtendedEnumValue):
other_value: int = field(compare=False)
>>> MultiAttr(SomeExtendedEnumValue(2, 30)) == MultiAttr.GREEN
True