为什么dir(x)中的所有名称都不适用于属性访问?

问题描述:

为什么编码器将东西填入__dict__不能用于属性访问?例如,在我的Plone实例中,dir(portal)包含index_html,但portal.index_html引发了AttributeError。对于Products.ZCatalog.Catalog.mybrains__class__属性也是如此。 dir()不能被信任是否有充分的理由?为什么dir(x)中的所有名称都不适用于属性访问?

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

我不知道Plone,所以下面是一般。

dirthe docs

如果对象有一个名为 __dir__()方法,这个方法将被调用,必须返回 属性列表。这允许对象执行定制__getattr__()__getattribute__()函数来定制dir()报告它们的 属性的方式。

只是猜测这里,但我能想到的两件事情,可能是happening--

  • 对象具有__dir__()方法返回的属性,它并没有

  • (不太可能)对象您要求的属性(即它在obj.__dict__type(obj).__dict__,但是覆盖__getattr__返回AttributeError

编辑__dir__只支持在Python 2.6+,但是(不建议使用)特殊属性__methods____members__可以用来代替早期版本。

+0

`__dir__`是Python 2.6中的新增功能,并且IIRC Zope仍然不能运行在比Python 2.4更新的任何东西上。 – habnabit 2009-01-28 02:55:12