为啥 dir(x) 中的所有名称都不能用于属性访问?
Posted
技术标签:
【中文标题】为啥 dir(x) 中的所有名称都不能用于属性访问?【英文标题】:Why aren't all the names in dir(x) valid for attribute access?为什么 dir(x) 中的所有名称都不能用于属性访问? 【发布时间】:2010-10-03 20:39:52 【问题描述】:为什么编码员会将不能用于属性访问的东西塞入__dict__
?例如,在我的 Plone 实例中,dir(portal)
包含 index_html
,但 portal.index_html
引发 AttributeError。 Products.ZCatalog.Catalog.mybrains
的 __class__
属性也是如此。 dir()
不能被信任有充分的理由吗?
查看inspect
模块,我看到他们使用object.__dict__['x']
而不是属性访问,原因是他们不想触发getattr
魔法。
【问题讨论】:
【参考方案1】:我不了解Plone,所以以下是笼统的。
来自dir
的the docs:
如果对象有一个名为的方法
__dir__()
,这个方法会被调用,必须返回列表 属性。这允许对象 实现自定义__getattr__()
或__getattribute__()
函数自定义dir()
报告他们的方式 属性。
这里只是猜测,但我能想到可能发生的两件事--
该对象有一个__dir__()
方法,该方法返回它没有的属性
(不太可能)对象具有您要求的属性(即在obj.__dict__
或type(obj).__dict__
,但覆盖__getattr__
以返回AttributeError
编辑:__dir__
仅在 Python 2.6+ 中受支持,但是(已弃用的)特殊属性 __methods__
和 __members__
可以用于早期版本。
【讨论】:
__dir__
在 python 2.6 中是新的,IIRC Zope 仍然不能在比 python 2.4 更新的任何东西上运行。
没错,我使用的是 Python 2.4。 Zope 尚未在较新的 Python 上正式运行,尽管它已经进行了实验。以上是关于为啥 dir(x) 中的所有名称都不能用于属性访问?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Room 实体不适用于 Android 中的不可变属性