为什么不是所有的名字在dir(x)有效期为属性的访问?
-
20-08-2019 - |
题
为什么一个编码的东西事情 __dict__
这不能用于属性的访问?例如,在我Plone实例, dir(portal)
包括 index_html
, 但 portal.index_html
提出了AttributeError.这也是真实的 __class__
属性的 Products.ZCatalog.Catalog.mybrains
.是有一个很好的理由为什么 dir()
不能信任吗?
闲逛的 inspect
模块,我看到他们使用 object.__dict__['x']
而不是属性访问对于这个原因且因为他们不想要触发器 getattr
魔法。
解决方案
我不知道Plone,所以下面是一般的。
从 文档 的 dir
:
如果象有一个方法叫
__dir__()
, 这种方法将被和必须返回该列表中的 属性。这允许对象 实现一个自定义__getattr__()
或__getattribute__()
功能的定制的方式dir()
报告他们的 属性。
只是猜测,但我可以想到的两个东西,可能发生的事情--
对象有一个
__dir__()
方法,返回的属性,它没有(可能性较小)的对象 已 属性,你要求(即这是在
obj.__dict__
或type(obj).__dict__
, 但复盖__getattr__
返回AttributeError
编辑: __dir__
只是支持在Python2.6+,但(deprecated)特殊属性 __methods__
和 __members__
可以使用,而不是对先前版本。
不隶属于 StackOverflow