Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:内置dir()函数无法访问枚举类元素_Python_Python 3.x_Class_Dictionary_Enums - Fatal编程技术网

Python:内置dir()函数无法访问枚举类元素

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):

我正在尝试使用内置的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):
    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呢?