覆盖 Enum._generate_next_value_ 未按预期与 MRO 一起工作?
Overriding Enum._generate_next_value_ not working as expected with MRO?
为什么重写 _generate_next_value_
只有在最后继承的枚举中才有效?
例如:
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'>, <enum 'OtherEnum'>, <enum 'AutoEnum'>, <enum 'Enum'>, <class 'object'>)
name: TEST, value: overriding _generate_next_value
如果默认值 _generate_next_value_
每次都被设置,如果它没有被特别覆盖,那么当 Enum 被继承时它如何不被再次重置?
我想我遗漏了一些东西 how/why 这是这样工作的。
需要在 class 实际创建之前准备好特殊方法,例如 _generate_next_value_
。为了支持这一点,EnumMeta
在基 Enum
class 中寻找这些特殊方法——而基 Enum
class 是最后一个列出的方法。
当然感觉就像任何其他 Enum
classes 也应该搜索枚举方法。
披露:我是 Python stdlib Enum
, the enum34
backport, and the Advanced Enumeration (aenum
) 库的作者。
为什么重写 _generate_next_value_
只有在最后继承的枚举中才有效?
例如:
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'>, <enum 'OtherEnum'>, <enum 'AutoEnum'>, <enum 'Enum'>, <class 'object'>)
name: TEST, value: overriding _generate_next_value
如果默认值 _generate_next_value_
每次都被设置,如果它没有被特别覆盖,那么当 Enum 被继承时它如何不被再次重置?
我想我遗漏了一些东西 how/why 这是这样工作的。
需要在 class 实际创建之前准备好特殊方法,例如 _generate_next_value_
。为了支持这一点,EnumMeta
在基 Enum
class 中寻找这些特殊方法——而基 Enum
class 是最后一个列出的方法。
当然感觉就像任何其他 Enum
classes 也应该搜索枚举方法。
披露:我是 Python stdlib Enum
, the enum34
backport, and the Advanced Enumeration (aenum
) 库的作者。