Я пытаюсь создать абстрактный enum (на самом деле Flag
) с помощью абстрактного метода.Моя конечная цель - создать строковое представление составных перечислений на основе базовых перечислений, которые я определил.Я могу получить эту функциональность, не делая класс абстрактным.
Это базовый класс Flag
и пример реализации:
from enum import auto, Flag
class TranslateableFlag(Flag):
@classmethod
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 Students(TranslateableFlag):
ALICE = auto()
BOB = auto()
CHARLIE = auto()
ALL = ALICE | BOB | CHARLIE
@classmethod
def base(cls):
return {Students.ALICE: "Alice", Students.BOB: "Bob",
Students.CHARLIE: "Charlie"}
Пример использования:
((Students.ALICE | Students.BOB).translate())
[Out]: 'Alice | Bob'
Сбой при переключении на TranslateableFlag(Flag, ABC)
из-за конфликтов MetaClass.(Я не понял этот пост - Абстрактный класс Enum с использованием ABCMeta и EnumMeta , поэтому я не уверен, что он отвечает на мой вопрос).
Я хотел бы получить такую функциональность, как этакак-то:
@abstractclassmethod
@classmethod
def base(cls):
pass
Можно ли этого добиться?