【问题标题】:Fix 'new enumerations must be created as'修复“必须将新枚举创建为”
【发布时间】:2017-04-24 10:09:27
【问题描述】:

我正在使用 Python 2 并有以下课程

import enum

class MyClass(object):
    pass

@enum.unique
classMyEnum(enum.IntEnum, MyClass):
    A = 1
    B = 2

当我运行此代码时,出现以下错误:

  File "C:\Python27\lib\site-packages\enum\__init__.py", line 506, in _get_mixins_
    raise TypeError("new enumerations must be created as "
TypeError: new enumerations must be created as `ClassName([mixin_type,] enum_type)`

我经常使用 Python,但我必须承认我从未真正投入其中。我无法弄清楚发生了什么。我不确定如何阅读此错误。有人可以帮我解决这个问题吗?

【问题讨论】:

  • 在您的代码示例中,class MyEnum 中缺少一个空格

标签: python python-2.7 enums typeerror


【解决方案1】:

错误是因为您需要在Enum 类之前列出MixinType,例如:

class FunEnum(int, Enum):
    A = 1
    B = 2

但是由于您已经在使用intEnum(这已经是一个混合枚举),您不想混合另一种类型,对吧?所以你可以简单地使用:

@enum.unique
class FunEnum(enum.IntEnum):
    A = 1
    B = 2

mixin 类型定义了值被转换到哪个类,如果你想要MyClassint,Python 如何解决这个问题?因此尝试它会引发另一个错误:

@enum.unique
class FunEnum(str, enum.IntEnum):
    A = 1
    B = 2

TypeError: 多个base有实例布局冲突

class MyClass(object):
    pass

@enum.unique
class FunEnum(MyClass, enum.IntEnum):
    A = 1
    B = 2

TypeError: object.__new__(FunEnum) 不安全,使用int.__new__()

【讨论】:

  • 实际上,如果您正确排序继承,将MyClassintEnum 混合似乎可以正常工作。 class MyEnum(int, MyClass, enum.Enum): 工作得很好,因为它确保int.__new__ 优先于泛型(并且不适合int 子类)object.__new__。您只需将int 显式放在其他超类之前,这意味着您必须分别从intenum.Enum 继承(不过这很好;IntEnum 本身是一个定义为class IntEnum(int, Enum): 的空类)。
  • 嗯,有趣的一点。我从不认为这是有道理的,因为它们会相互覆盖__new__
  • __new__ 遵循正常的继承查找规则;您在 MRO 中找到第一个具有实现的类并调用它。任何进一步的授权都取决于该方法;如果它不进一步委托,则不会调用其他 __new__s。这确实意味着如果MyClass 需要初始化,您需要将它放在__init__ 中(int 不会干扰)或将它放在基础列表的首位并明确重载__new__,这样它委托给super().__new__,然后进一步初始化结果。我没有说它不复杂。 :-)
猜你喜欢
  • 2016-10-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-31
  • 2010-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-06
相关资源
最近更新 更多