涉及 Enum 的多重继承元类冲突

Posted

技术标签:

【中文标题】涉及 Enum 的多重继承元类冲突【英文标题】:Multiple inheritance metaclass conflict involving Enum 【发布时间】:2021-10-30 10:34:41 【问题描述】:

我需要一个 Enum 类的双重继承,但也支持我自己的方法。 这是上下文:

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

我尝试通过以下方式申请this *** solution:

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 类型特有的问题,还是我遗漏了有关元类的其他内容?

【问题讨论】:

一般来说,元类不组成。我会重新考虑您是否真的需要 FirstClass 作为抽象基类。 对于正确的抽象枚举类型,请使用来自this answer 的ABCEnumMeta 【参考方案1】:

解决您当前问题的方法是:

class MyFinalClass(MyFirstClass, Enum, metaclass=MyMetaClass):
    pass

请注意,Enum 是列出的最后一个常规类。

对于功能齐全的抽象枚举,您需要使用来自this answer 的ABCEnumMeta——否则将无法正确标记缺少的抽象方法。

【讨论】:

以上是关于涉及 Enum 的多重继承元类冲突的主要内容,如果未能解决你的问题,请参考以下文章

元类冲突、多重继承、实例为父

将元类与多重继承结合使用的 TypeErrors

来自元类工厂的多重继承

三重继承导致元类冲突......有时

三重继承导致元类冲突......有时

Django:从带有元的抽象类的多重继承