涉及 Enum 的多重继承元类冲突
Multiple inheritance metaclass conflict involving Enum
我需要一个 class 的双重继承,它是一个枚举,但也支持我自己的方法。
这是上下文:
import abc
from enum import Enum
class MyFirstClass(abc.ABC):
@abc.abstractmethod
def func(self):
pass
class MySecondClass(Enum, MyFirstClass):
VALUE_1 = 0
VALUE_2 = 1
def func(self):
return 42
MySecondClass
的声明产生以下错误:
TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases
我尝试通过以下方式应用 :
class MyMetaClass(type(Enum), type(MyFirstClass)):
pass
class MyFinalClass(Enum, MyFirstClass, metaclass=MyMetaClass):
VALUE_1 = 0
VALUE_2 = 1
def func(self):
return 42
但我收到以下错误:
TypeError: new enumerations should be created as `EnumName([mixin_type, ...] [data_type,] enum_type)`
这是 Enum
类型特有的问题,还是我遗漏了有关 metaclasses 的其他内容?
解决您当前问题的方法是:
class MyFinalClass(MyFirstClass, Enum, metaclass=MyMetaClass):
pass
请注意 Enum
是最后列出的常规 class。
对于功能齐全的抽象枚举,您需要使用 中的 ABCEnumMeta
—— 否则将无法正确标记缺少的抽象方法。
我需要一个 class 的双重继承,它是一个枚举,但也支持我自己的方法。 这是上下文:
import abc
from enum import Enum
class MyFirstClass(abc.ABC):
@abc.abstractmethod
def func(self):
pass
class MySecondClass(Enum, MyFirstClass):
VALUE_1 = 0
VALUE_2 = 1
def func(self):
return 42
MySecondClass
的声明产生以下错误:
TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases
我尝试通过以下方式应用
class MyMetaClass(type(Enum), type(MyFirstClass)):
pass
class MyFinalClass(Enum, MyFirstClass, metaclass=MyMetaClass):
VALUE_1 = 0
VALUE_2 = 1
def func(self):
return 42
但我收到以下错误:
TypeError: new enumerations should be created as `EnumName([mixin_type, ...] [data_type,] enum_type)`
这是 Enum
类型特有的问题,还是我遗漏了有关 metaclasses 的其他内容?
解决您当前问题的方法是:
class MyFinalClass(MyFirstClass, Enum, metaclass=MyMetaClass):
pass
请注意 Enum
是最后列出的常规 class。
对于功能齐全的抽象枚举,您需要使用 ABCEnumMeta
—— 否则将无法正确标记缺少的抽象方法。