这是使用ABCmeta和Enummeta来调整对抽象枚举类问题的接受答案的方法,以创建所需的抽象
Enum类:
from abc import abstractmethod, ABC, ABCmetafrom enum import auto, Flag, Enummetaclass ABCEnummeta(ABCmeta, Enummeta): def __new__(mcls, *args, **kw): abstract_enum_cls = super().__new__(mcls, *args, **kw) try: # Handle existence of undefined abstract methods. absmethods = list(abstract_enum_cls.__abstractmethods__) absmethods_str = ', '.join(f'{method!r}' for method in absmethods) plural = 's' if len(absmethods) > 1 else '' raise TypeError( f"cannot instantiate abstract class {abstract_enum_cls.__name__!r}" f" with abstract method{plural} {absmethods_str}") except AttributeError: pass return abstract_enum_clsclass TranslateableFlag(Flag, metaclass=ABCEnummeta): @classmethod @abstractmethod def base(cls): pass def translate(self): base = self.base() if self in base: return base[self] else: ret = [] for basic in base: if basic in self: ret.append(base[basic]) return " | ".join(ret)class Students1(TranslateableFlag): ALICE = auto() BOB = auto() CHARLIE = auto() ALL = ALICE | BOB | CHARLIE @classmethod def base(cls): return {Students1.ALICE: "Alice", Students1.BOB: "Bob", Students1.CHARLIE: "Charlie"}class Students2(TranslateableFlag): ALICE = auto() BOB = auto() CHARLIE = auto() ALL = ALICE | BOB | CHARLIE# Abstract method not defined - should raise TypeError.# @classmethod# def base(cls):# ...结果:
Traceback (most recent call last): ...TypeError: cannot instantiate abstract class 'TranslateableFlag' with abstract method 'base'



