【问题标题】:Method overloading of dynamically created Enum动态创建的枚举的方法重载
【发布时间】:2018-04-13 12:47:03
【问题描述】:

目标是使用动态创建的属性重载Enum__str__(self) 方法。

动态枚举可以用

创建

[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的方法?

【问题讨论】:

  • 您能否详细说明“未能提供完整功能”

标签: python python-3.x enums overloading


【解决方案1】:

你的第三个代码 sn-p 应该是:

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

注意我把__class__ 带走了。

【讨论】:

  • 啊,谢谢! - 只是出于好奇,是否有可能使第二种方法也起作用?
【解决方案2】:

另一种选择是 [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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-29
    • 1970-01-01
    • 2018-04-18
    相关资源
    最近更新 更多