我有以下enum定义:

from enum import Enum
class D(Enum):
    x = 1
    y = 2

print(D.x)

现在打印的值是

D.x

相反,我想打印enum的值

1

要实现这个功能,可以做些什么呢?


当前回答

最直接的dunder方法是_repr_而不是_str_,因为它也允许你在列表中以这种方式打印它。

class D(Enum):
  x = 1
  y = 2

  def __repr__(self):
      return self.value

print([D.x,D.y])
>>> [1, 2]

其他回答

如果你想将枚举成员与Int值进行比较,更好的方法是扩展IntEnum:

from enum import IntEnum


class D(IntEnum):
    x = 1
    y = 2


print(D.x)

通过这种方式,你可以在不显式调用.value的情况下将枚举的值与整数进行比较:

>>> D.x == 1
True

有关更多信息,您可以查看Python文档的这一部分:Enum比较

如果你打算使用f-string打印value,那么你可以从enum和str继承你的enum。这样你就可以同时拥有对象的value和name。例如:

from enum import Enum


class D(str, Enum):
    x = 1
    y = 2

print(D.x)
print(f"{D.x}")

输出:

D.x
1

仅从Enum继承将始终给出一个完整的限定名。

class D(Enum):
    x = 1
    y = 2

print(D.x)
print(f"{D.x}")

输出

D.x
D.x

这与如果你不继承任何东西相反,你将得到value而不是name:

class D:
    x = 1
    y = 2


print(D.x)
print(f"{D.x}")

输出

1
1

这就是为什么同时从str和Enum继承时,你会得到完整的限定名和值。

最直接的dunder方法是_repr_而不是_str_,因为它也允许你在列表中以这种方式打印它。

class D(Enum):
  x = 1
  y = 2

  def __repr__(self):
      return self.value

print([D.x,D.y])
>>> [1, 2]

我使用以下方法实现了访问

class D(Enum):
    x = 1
    y = 2

    def __str__(self):
        return '%s' % self.value

现在我可以做了

打印(D.x)得到1作为结果。

如果你想打印x而不是1,你也可以使用self.name。

您正在打印enum对象。如果你只是想打印它,使用.value属性:

print(D.x.value)

请参阅对枚举成员及其属性的编程访问部分:

如果你有一个enum成员,并且需要它的名称或值: >>> >>>成员= Color.red > > > member.name “红色” > > > member.value 1

你可以在枚举中添加__str__方法,如果你只是想提供一个自定义字符串表示:

class D(Enum):
    def __str__(self):
        return str(self.value)

    x = 1
    y = 2

演示:

>>> from enum import Enum
>>> class D(Enum):
...     def __str__(self):
...         return str(self.value)
...     x = 1
...     y = 2
... 
>>> D.x
<D.x: 1>
>>> print(D.x)
1