【问题标题】:Why isn't there __dict__ in dir("an imported module") as an attribute?为什么 dir("an import module") 中没有 __dict__ 作为属性?
【发布时间】:2018-08-06 08:44:19
【问题描述】:

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

【问题讨论】:

  • 你为什么会这样?
  • 我想你是说你导入了一个模块,而dir(modulename) 不包括__dict__,但modulename.__dict__ 似乎确实存在。如果在您的问题中说明了这一点,而不仅仅是隐含的,它可能会使您的问题更清楚。
  • 查看stackoverflow.com/questions/14361256/… 并查看我的答案以获取更多信息。
  • @toti08,我认为如果有一个工具可以让您快速轻松地列出对象的所有属性,那就太好了。我在想 dir() 或者什么东西有这个角色。
  • @khelwood,你是对的。您的描述是明确的,并清楚地说明了情况。

标签: python


【解决方案1】:

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

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

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

因此,请尝试查看您尝试从中获取信息的对象并自己查找属性。

【讨论】:

    【解决方案2】:

    答案在python documentation for the dir function

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

    __dict__ 是属于该异常的一个特殊属性。

    【讨论】:

      【解决方案3】:

      dir() 不只是查找对象的__dict__(有时甚至不存在),它会使用对象的继承(它的类或类型,以及该类的任何超类或父类或type) 为您提供所有可用属性的完整图片。

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

      欲了解更多信息,请查看the main differences between dir() and __dict__

      【讨论】:

        猜你喜欢
        • 2020-12-10
        • 2022-11-02
        • 2016-06-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-20
        • 1970-01-01
        相关资源
        最近更新 更多