如何将枚举值作为类属性直接访问?

2024-03-28 15:44:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在学习如何在Python中使用Enum类,并且发现每当我需要访问枚举的实际值时,我都需要附加.value属性:

from enum import Enum
class Pets(Enum):
    DOG = "Fido"
    CAT = "Kitty"

Pets.DOG # yields Pets.DOG
Pets.DOG.value # yields Fido

作为练习,我尝试配置我的Enum类,这样我就不需要继续访问value属性。我想要的行为是当我调用Pets.DOG时,我得到Fido作为我的值。

我试图用__getattr_(cls, item)来实现这一点:

^{pr2}$

但是,我收到一个RecursionError: maximum recursion depth exceeded while calling a Python object,而item是一个字符串值_value_。我不太明白为什么会发生这种行为-这是内置在Python中的行为,还是因为我使用了一个特殊的类Enum?在

我确实看了一篇类似的SO帖子,但是那里的解决方案是使用另一个模块(inspect),或者访问__dict__或{}并使用条件或正则表达式的组合自己解析它。有没有更好的方法来访问底层Enum的值?在


Tags: fromimport属性valueenumitemfidoclass
1条回答
网友
1楼 · 发布于 2024-03-28 15:44:18

如果要将属性映射到字符串,请不要使用enum类。enum模块的整个是生成一组表示枚举而不是字符串的singleton对象。从模块文档中:

An enumeration is a set of symbolic names (members) bound to unique, constant values. Within an enumeration, the members can be compared by identity, and the enumeration itself can be iterated over.)

粗体强调我的。字符串不是唯一的常量值(我可以随意创建更多的"Fido"字符串),并且不设计为通过标识进行比较(即使sometimes, for a subset of strings, you can)。在

只需使用字符串属性定义自己的类,直接:

class Pets:
    DOG = "Fido"
    CAT = "Kitty"

您的无限递归错误是由您对该方法的用途的误解引起的。与all special methods类似,object.attr对象类型上查找__getattr__,这意味着您的方法应用于Enum子类的实例,这里的DOG和{}属性,而不是类本身,并干扰EnumMeta元类试图测试_value_属性,它由您的__getattr__方法处理,其中self是新生成的Pets.DOG实例,item设置为{},然后调用{},后者调用{},等等

为了使您的方法有效,您必须将EnumMeta子类化并在该子类上实现^{}__getattr__只为缺少属性调用)。但是,考虑到__getattribute__用于all属性访问,因此您必须首先注意检查当前类的实例:

^{pr2}$

此时Pets.DOG产生{}。在

相关问题 更多 >