Перегрузка метода динамически созданного Enum

Цель состоит в том, чтобы перегрузить метод __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?

не могли бы вы уточнить «не в состоянии обеспечить полную функциональность»

Azsgy 13.04.2018 14:49
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
1
54
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Ваш третий фрагмент кода должен быть:

A.__str__ = lambda self: str(self.name)

Обратите внимание, я вынул __class__.

Ах, спасибо! - Из любопытства, есть ли возможность заставить работать и второй подход?

MLmuchAmaze 13.04.2018 15:34

Другой вариант - [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)

Другие вопросы по теме