正在覆盖枚举。\u生成\u下一个\u值\u与MRO不按预期工作?

2024-10-02 02:39:48 发布

您现在位置:Python中文网/ 问答频道 /正文

为什么只有在上一个继承的枚举中重写_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_,但没有特别覆盖它,那么在继承枚举时,它怎么不会再次重置

我想我在如何/为什么这样工作方面遗漏了一些东西


Tags: nametestreturnvaluedefenumgenerateclass
1条回答
网友
1楼 · 发布于 2024-10-02 02:39:48

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

当然,感觉上任何其他Enum类也应该搜索enum方法

Issue created


披露:我是Python stdlib ^{}^{} backport、和Advanced Enumeration (^{})图书馆的作者

相关问题 更多 >

    热门问题