为什么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,所以下面是一般。
从dir
the docs:
如果对象有一个名为
__dir__()
方法,这个方法将被调用,必须返回 属性列表。这允许对象执行定制__getattr__()
或__getattribute__()
函数来定制dir()
报告它们的 属性的方式。
只是猜测这里,但我能想到的两件事情,可能是happening--
对象具有
__dir__()
方法返回的属性,它并没有(不太可能)对象有您要求的属性(即它在
obj.__dict__
或type(obj).__dict__
,但是覆盖__getattr__
返回AttributeError
编辑:__dir__
只支持在Python 2.6+,但是(不建议使用)特殊属性__methods__
和__members__
可以用来代替早期版本。
`__dir__`是Python 2.6中的新增功能,并且IIRC Zope仍然不能运行在比Python 2.4更新的任何东西上。 – habnabit 2009-01-28 02:55:12