【问题标题】:Overriding Enum._generate_next_value_ not working as expected with MRO?覆盖 Enum._generate_next_value_ 在 MRO 中没有按预期工作?
【发布时间】:2021-03-29 09:54:03
【问题描述】:

为什么覆盖 _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'>, <enum 'OtherEnum'>, <enum 'AutoEnum'>, <enum 'Enum'>, <class 'object'>)
name: TEST, value: overriding _generate_next_value

如果每次都设置默认的_generate_next_value_,如果它没有被特别覆盖,那么在继承 Enum 时它如何不被再次重置?

我想我错过了一些关于如何/为什么这样工作的东西。

【问题讨论】:

  • 在自动其他中覆盖它?
  • 我不是在问如何在此处更改功能,如果不清楚的话。我在问为什么会有这样的行为。

标签: python python-3.x enums multiple-inheritance


【解决方案1】:

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

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

Issue created.


披露:我是 Python stdlib Enumenum34 backportAdvanced Enumeration (aenum) 库的作者。

【讨论】:

    猜你喜欢
    • 2018-07-17
    • 1970-01-01
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多