Python:内置dir()函数无法访问枚举类元素
我正在尝试使用内置的dir获取ENUM类变量。 对于普通类,我们得到以下结果Python:内置dir()函数无法访问枚举类元素,python,python-3.x,class,dictionary,enums,Python,Python 3.x,Class,Dictionary,Enums,我正在尝试使用内置的dir获取ENUM类变量。 对于普通类,我们得到以下结果 from enum import Enum class foo(Enum): a = 1 b = 2 c = 3 >>> dir(foo) ['__class__', '__doc__', '__members__', '__module__', 'a', 'b', 'c'] 但是如果我稍微调整一下这个类,使用点运算符得到字典值,如下所示 class foo(Enum):
from enum import Enum
class foo(Enum):
a = 1
b = 2
c = 3
>>> dir(foo)
['__class__', '__doc__', '__members__', '__module__', 'a', 'b', 'c']
但是如果我稍微调整一下这个类,使用点运算符得到字典值,如下所示
class foo(Enum):
class DotDict(dict):
# Use this to access the dictionary elements using dot notation
def __getattr__(*args):
val = dict.get(*args)
return DotDict(val) if type(val) is dict else val
__setattr__ = dict.__setitem__
__delattr__ = dict.__delitem__
# class variables
a = DotDict({'index': 1, 'city': {'name': 'NY', 'len': 2}})
b = DotDict({'index': 2, 'city': {'name': 'London', 'len': 6}})
c = DotDict({'index': 3, 'city': {'name': 'Delhi', 'len': 5}})
我得到了如下结果,没有包含类变量
>>> dir(foo)
['DotDict', '__class__', '__doc__', '__members__', '__module__']
奇怪的是,我仍然可以访问如下的类变量
>>> foo.a.index
1
>>> foo.b.city.name
London
我不知道class对象无法访问class变量的确切原因。有没有什么方法可以像我们使用内置的dir那样获得上述类的整个类变量列表?在早期的3.x行中,
dir()
作为类上的\uu dir
方法实现了,而Enum
利用这一点,只显示四个\uuuuuxxx\uuuuuuuuu
属性和任何成员
a
、b
和c
之所以没有出现在dir(foo)
中,是因为它们不是成员,它们不是成员是因为DotDict.\uu getattr\uuuu()
被破坏
\uuu getattr\uuuu
对于缺少的属性的适当响应是引发一个AttributeError
,但是您的响应是返回DotDict
实例和搜索名称,这可以在添加print()
时看到:
>>> a.__get__
({'a': 1}, '__get__')
这一点很重要,因为描述符不会转换为成员,并且存在\uuuuu get\uuuuuu
、\uuuu set\uuuuu
或\uuu delete\uuuu
表示描述符
TL;DR
修复你的
\uuu getattr\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。但是,有什么解释为什么变量作为DotDict的类变量而不是foo呢?