Цель состоит в том, чтобы перегрузить метод __str__(self) в Enum динамически создаваемыми атрибутами.
Динамическое перечисление может быть создано с помощью
[1]:
from enum import Enum, auto
A = Enum('A',
dict(('a_'+some_input, auto())
for some_input in ['1','2','3']),
module=__name__)
Перегрузка метода может быть выполнена с помощью
[2]:
class A(Enum):
a_no_input = auto()
def __str__(self):
return str(self.name)
По отдельности оба примера работают по мере необходимости. Чтобы объединить оба, я попробовал:
[1]: ...
A.__class__.__str__ = lambda self: str(self.name)
Но это не меняет вывод print(A.a_1).
а также
class A(Enum):
def __init__(self):
super('A',
dict(('a_' + some_input, auto())
for some_input in ['1', '2', '3']),
module=__name__)
def __str__(self):
return str(self.name)
Но это не создает статических атрибутов, к которым можно получить доступ через A.a_1.
Как мне динамически создавать статические атрибуты перечисления и перегружать методы суперкласса Enum?






Ваш третий фрагмент кода должен быть:
A.__str__ = lambda self: str(self.name)
Обратите внимание, я вынул __class__.
Ах, спасибо! - Из любопытства, есть ли возможность заставить работать и второй подход?
Другой вариант - [2] + [1]. Перечисления могут быть разделены на подклассы, если они пусты:
from enum import Enum, auto
class EnumStr(Enum):
def __str__(self):
return str(self.name)
A = EnumStr('A',
dict(('a_'+some_input, auto())
for some_input in ['1','2','3']),
module=__name__)
print(A.a_1)
не могли бы вы уточнить «не в состоянии обеспечить полную функциональность»