为啥 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) 中的所有名称都不能用于属性访问?的主要内容,如果未能解决你的问题,请参考以下文章

为啥反射type.GetFields 取不到任何值

子类为啥不能直接调用父类的属性

为啥我不能使用“描述”作为核心数据实体的属性名称?

为啥 Room 实体不适用于 Android 中的不可变属性

python遍历并获取对象属性--dir(),__dict__,getattr,setattr

为啥宿主机不能访问虚拟机