我定义了以下枚举:
from enum import Enum
class D(Enum):
x = 1
y = 2
print(D.x)
现在打印的值为
D.x
相反,我希望打印枚举的值
1
可以做什么来实现这个功能?
您正在打印枚举对象。如果您只想打印该内容,请使用
.value
属性:
print(D.x.value)
请参阅 以编程方式访问枚举成员及其属性部分:
如果您有枚举成员并需要其名称或值:
>>> >>> member = Color.red >>> member.name 'red' >>> 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
我使用以下方法实现了访问
class D(Enum):
x = 1
y = 2
def __str__(self):
return '%s' % self.value
现在我可以做
print(D.x)
得到 1
结果。
如果您想打印
self.name
而不是 x
,也可以使用 1
。
如果您要使用 f 字符串打印值,那么您可以从
Enum
和 str
继承枚举。这样您就可以获得对象的值和名称。例如:
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
这与如果您不继承任何您将获得值而不是名称的东西相反:
class D:
x = 1
y = 2
print(D.x)
print(f"{D.x}")
输出
1
1
这就是为什么从
str
和 Enum
继承,您将获得完整的限定名称和值。
如果您想将枚举成员与
Int
值进行比较,更好的方法是扩展 IntEnum
:
from enum import IntEnum
class D(IntEnum):
x = 1
y = 2
print(D.x)
通过这种方式,您可以将枚举值与整数进行比较,而无需显式调用
.value
:
>>> D.x == 1
True
有关更多信息,您可以查看Python文档的这部分:Enum比较
最简单的 dunder 方法是 __repr__ 而不是 __str__,因为它还允许您在列表中以这种方式打印它。
class D(Enum):
x = 1
y = 2
def __repr__(self):
return self.value
print([D.x,D.y])
>>> [1, 2]
编辑:
由于如果您使用 print(D.x) 它仍然会打印 D.x,所以我认为实现此目的的更好方法是添加 __str__ 方法。
class D(Enum):
x = 1
y = 2
def __str__(self):
return str(self.value)
def __repr__(self):
return str(self)