重写 Enum._generate_next_value_ 无法按 MRO 的预期工作?

fil*_*nts 3 python enums multiple-inheritance python-3.x

为什么重写_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}')
Run Code Online (Sandbox Code Playgroud)

输出:

AutoOther.TEST: mro=(<enum 'AutoOther'>, <enum 'AutoEnum'>, <enum 'OtherEnum'>, <enum 'Enum'>, <class 'object'>)
name: TEST, value: 1

OtherAuto.TEST: mro=(<enum 'OtherAuto'>, <enum 'OtherEnum'>, <enum 'AutoEnum'>, <enum 'Enum'>, <class 'object'>)
name: TEST, value: overriding _generate_next_value
Run Code Online (Sandbox Code Playgroud)

_generate_next_value_如果每次都以某种方式设置默认值(如果没有专门覆盖它),那么在继承 Enum 时如何不会再次重置它?

我想我遗漏了一些关于如何/为什么这样工作的内容。

Eth*_*man 5

特殊方法,例如_generate_next_value_需要在实际创建类之前就位。为了支持这一点,EnumMeta在基类中查找这些特殊方法Enum——基Enum类是最后列出的。

不过,当然感觉任何其他Enum类也应该搜索枚举方法。

问题已创建


声明:我是Python stdlibEnumenum34backportAdvanced Enumeration ( aenum)库的作者 。