我有一个自定义的enum
,,MyEnum
其中的一些元素具有不同的名称但相同的值。
from enum import Enum
class MyEnum(Enum):
A = 1
B = 2
C = 3
D = 1 # Same value as A
因此,list(MyEnum)
仅返回部分成员的名称(每个值的名字):
>>>list(MyEnum)
[<MyEnum.A: 1>, <MyEnum.B: 2>, <MyEnum.C: 3>]
显然,list(MyEnum.__members__)
返回所有名称:
>>>list(MyEnum.__members__)
['A', 'B', 'C', 'D']
但是,如果我尝试覆盖__iter__()
我的枚举的方法,则覆盖似乎会失败:
class MyEnum(Enum):
A = 1
B = 2
C = 3
D = 1 # Same value as A
@classmethod # an attempt to override list(MyEnum) that doesn't change anything
def __iter__(cls):
return iter(list(cls.__members__))
显然list(MyEnum)
从来没有达到过习俗__iter__()
(比如说,print()
在我们的习俗中返回之前添加一个__iter__()
)。
这是为什么?
我如何覆盖默认行为list(MyEnum)
以便获得所有不同的名称?
类方法与元类上的实例方法不同,后者的作用是
__iter__
。Enum
您需要定义一个新的元类,然后可以使用该元类定义新的子类,以Enum
完成您想要的操作。需要注意的是:我不保证用
EnumType.__iter__
您的建议替换的当前行为将与的当前语义兼容Enum
,而只是保证这将使您的定义可用。