为什么 dir( "an imported module" ) 中没有__dict__作为属性?



在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__之间的主要差异。

最新更新