如何解决哪些特殊方法绕过了__getattribute__?
你可以找到python3在应答文件的object.__getattribute__
,其中规定:
无条件调用以实现类实例的属性访问。如果该类也定义
__getattr__()
,则不会调用后者,除非__getattribute__()
显式调用它或引发AttributeError。此方法应返回(计算出的)属性值或引发AttributeError异常。为了避免此方法的无限递归,其实现应始终调用具有相同名称的基类方法以访问其所需的任何属性,例如object。__getattribute__(self, name)
。
同时此页解释了这个“机器”是如何工作的。从根本上讲__getattribute__
,只有当您使用.
(点)运算符(以及hasattr
Zagorulkin指出)访问属性时,才会调用该方法。
请注意,该页面未指定隐式查找哪些特殊方法,因此我认为所有这些方法均适用(您可以在此处找到)。
解决方法
除了出于正确性的考虑绕过任何实例属性之外,隐式特殊方法查找通常还绕过该
__getattribute__()
方法,甚至对象的元类。
这些文档中提到了__hash__
,__repr__
和等特殊方法,__len__
根据经验,我也知道它也__iter__
适用于Python
2.7。
引用相关问题的答案:
“魔术
__methods__()
被特殊对待:它们在类型数据结构中内部分配给“插槽”,以加快查找速度,并且仅在这些插槽中查找。”
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。