在Python中,我们总是被告知dir
列出其被查询对象的任何属性。但是为什么dir("an imported module")
中没有__dict__
呢?
不能依赖dir([object])
返回准确的结果。如前所述:
如果对象有一个名为
__dir__()
的方法,则此方法将调用,并且必须返回属性列表。这允许对象实现自定义__getattr__()
或__getattribute__()
函数来自定义dir()
报告其属性的方式。如果对象不提供
__dir__()
,则函数会尝试最好从对象的__dict__
属性收集信息,如果已定义,并来自其类型对象。结果列表不是必须完整,并且当对象具有自定义CCD_ 11。
因此,请尝试查看您试图从中获取信息的对象,并自己查找属性。
答案在dir
函数的python文档中:
注意:由于
dir()
主要是为了方便在交互式提示下使用而提供的,因此它试图提供一组有趣的名称,而不是提供一组严格或一致定义的名称,并且其详细行为可能会随发布而变化。例如,当参数是类时,元类属性不在结果列表中。
__dict__
是属于该异常的一个特殊属性。
dir()
不仅查找对象的__dict__
(有时甚至不存在(,它还将使用对象的继承(其类或类型,以及该类或类型的任何超类或父类(来为您提供所有可用属性的完整图片。
实例__dict__
只是该实例上的"本地"属性集,并不包含该实例上可用的所有属性。相反,您还需要查看类和类的继承树。
有关更多信息,请查看dir()
和__dict__
之间的主要差异。