涉及枚举的多重继承元类冲突

9
我需要一个双重继承的类,它是一个枚举类型,但也支持我的自定义方法。 这是上下文:
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

我尝试应用这个Stack Overflow的解决方案,按照以下步骤进行:

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)`

这是一个特定于枚举类型的问题,还是我对元类有什么理解上的漏洞?


3
通常情况下,元类无法组合。我建议重新考虑是否真的需要将 FirstClass 设计为抽象基类。 - chepner
1
为了创建一个合适的抽象枚举类型,请使用来自此答案ABCEnumMeta - Ethan Furman
1个回答

6
你当前问题的解决方案是:
class MyFinalClass(MyFirstClass, Enum, metaclass=MyMetaClass):
    pass

请注意,Enum是最后一个常规类。
要创建一个完全功能的抽象Enum,您需要使用来自此答案ABCEnumMeta 。否则,缺少的抽象方法将无法正确标记。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接