3

__dict__为什么编码员会将不能用于属性访问的东西塞入其中?例如,在我的 Plone 实例中,dir(portal)包含index_html,但portal.index_html会引发 AttributeError。__class__的属性也是如此Products.ZCatalog.Catalog.mybrains。有充分的理由dir()不值得信任吗?

在模块周围戳inspect,我看到他们使用object.__dict__['x']而不是属性访问是出于这个原因并且因为他们不想触发getattr魔法。

4

1 回答 1

2

我不了解Plone,所以以下是一般性的。

来自以下文档dir

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

只是在这里猜测,但我能想到可能发生的两件事——

  • 该对象有一个__dir__()方法可以返回它没有的属性

  • (不太可能)该对象具有您要求的属性(即它在obj.__dict__or中type(obj).__dict__,但覆盖__getattr__返回AttributeError

编辑__dir__仅在 Python 2.6+ 中受支持,但是(不推荐使用的)特殊属性__methods__可以__members__用于早期版本。

于 2009-01-27T22:30:02.877 回答