我正在学习如何在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)
来实现这一点:
但是,我收到一个RecursionError: maximum recursion depth exceeded while calling a Python object
,而item
是一个字符串值_value_
。我不太明白为什么会发生这种行为-这是内置在Python中的行为,还是因为我使用了一个特殊的类Enum
?在
我确实看了一篇类似的SO帖子,但是那里的解决方案是使用另一个模块(inspect
),或者访问__dict__
或{Enum
的值?在
如果要将属性映射到字符串,请不要使用enum类。
enum
模块的整个点是生成一组表示枚举而不是字符串的singleton对象。从模块文档中:粗体强调我的。字符串不是唯一的常量值(我可以随意创建更多的
"Fido"
字符串),并且不设计为通过标识进行比较(即使sometimes, for a subset of strings, you can)。在只需使用字符串属性定义自己的类,直接:
您的无限递归错误是由您对该方法的用途的误解引起的。与all special methods类似,}属性,而不是类本身,并干扰},然后调用{},后者调用{},等等
object.attr
在对象类型上查找__getattr__
,这意味着您的方法应用于Enum
子类的实例,这里的DOG
和{EnumMeta
元类试图测试_value_
属性,它由您的__getattr__
方法处理,其中self
是新生成的Pets.DOG
实例,item
设置为{为了使您的方法有效,您必须将} (
^{pr2}$EnumMeta
子类化并在该子类上实现^{__getattr__
只为缺少的属性调用)。但是,考虑到__getattribute__
用于all属性访问,因此您必须首先注意检查当前类的实例:此时}。在
Pets.DOG
产生{相关问题 更多 >
编程相关推荐