问题描述
为什么覆盖 _generate_next_value_
仅在 LAST 继承的枚举中完成时才有效?
例如:
class AutoEnum(Enum):
def _generate_next_value_(name,start,count,last_values):
return 'overriding _generate_next_value'
class OtherEnum(Enum):
def some_other_method(self):
return
class AutoOther(AutoEnum,OtherEnum):
TEST = auto()
class OtherAuto(OtherEnum,AutoEnum):
TEST = auto()
print(f'{AutoOther.TEST}: mro={getmro(AutoOther)}\n'
f'name: {AutoOther.TEST.name},value: {AutoOther.TEST.value}')
print(f'{OtherAuto.TEST}: mro={getmro(OtherAuto)}\n'
f'name: {OtherAuto.TEST.name},value: {OtherAuto.TEST.value}')
输出:
AutoOther.TEST: mro=(<enum 'AutoOther'>,<enum 'AutoEnum'>,<enum 'OtherEnum'>,<enum 'Enum'>,<class 'object'>)
name: TEST,value: 1
OtherAuto.TEST: mro=(<enum 'OtherAuto'>,value: overriding _generate_next_value
如果每次都以某种方式设置默认的 _generate_next_value_
,如果它没有被特别覆盖,那么在继承 Enum 时如何不会再次重置它?
我想我遗漏了一些关于如何/为什么这样工作的内容。
解决方法
在实际创建类之前需要准备好诸如 _generate_next_value_
之类的特殊方法。为了支持这一点,EnumMeta
在基 Enum
类中查找这些特殊方法 -- 而基 Enum
类是列出的最后一个。
当然感觉也应该搜索任何其他 Enum
类以查找枚举方法。
披露:我是 Python stdlib Enum
、enum34
backport 和 Advanced Enumeration (aenum
) 库的作者。