为什么在dir(“导入的模块”)中没有__dict__作为属性?

时间:2018-08-06 08:44:19

标签: python

在Python中,总是被告知dir列出了其可疑对象的任何属性。但是为什么__dict__中没有dir("an imported module")

3 个答案:

答案 0 :(得分:1)

您不能依靠dir([object])返回准确的结果。如here所述:

  

如果对象具有名为__dir__()的方法,则该方法将为   调用,并且必须返回属性列表。这允许对象   实现自定义__getattr__()__getattribute__()的   函数来定制dir()报告其属性的方式。

     

如果对象不提供__dir__(),则该函数尝试其   最好从对象的__dict__属性中收集信息,如果   定义,并从其类型对象。结果列表不是   必定是完整的,并且当对象具有   自定义__getattr__()

因此,请尝试查看您要从中获取信息的对象,然后自行查找属性。

答案 1 :(得分:0)

答案在python documentation for the dir function中:

  

注意:由于dir()主要是为了方便用户在交互式提示中使用而提供的,因此它提供的是一组有趣的名称,而不是严格或一致地提供定义的名称集,其详细行为可能会随版本而变化。例如,当参数为类时,元类属性不在结果列表中。

__dict__是该异常的一部分的特殊属性。

答案 2 :(得分:0)

dir()不仅会查找对象的__dict__(有时甚至不存在),还会使用对象的遗产(其类或类型,以及任何超类或父对象,类或类型),以便为您提供所有可用属性的完整图片。

实例__dict__只是该实例上的“本地”属性集,并不包含该实例上可用的每个属性。相反,您还需要查看类和类的继承树。

有关更多信息,请查看the main differences between dir() and __dict__