可能的重复:
元类上的拦截运算符查找
如何在新样式类中拦截对 python“神奇”方法的调用?
考虑以下代码:
class ClassA(object):
def __getattribute__(self, item):
print 'custom__getattribute__ - ' + item
return ''
def __str__(self):
print 'custom__str__'
return ''
a=ClassA()
print 'a.__str__: ',
a.__str__
print 'str(a): ',
str(a)
输出令我惊讶:
a.__str__: custom__getattribute__ - __str__
str(a): custom__str__
- Isn't
str(a)
应该映射到魔术方法a.__str__()
?
- 如果我删除自定义
ClassA.__str__()
, then
ClassA.__getattribute__()
还是没接电话。怎么会?
正如 user1579844 所链接的,正在发生的事情是,新型类避免了 __getattribute__ 的正常查找机制,并在解释器调用它们时直接加载该方法。这样做是出于性能原因,因为这种神奇方法非常常见,以至于标准查找会严重减慢系统速度。
当您使用点符号显式调用它们时,您将退回到标准查找,因此您首先调用 __getattribute__ 。
如果您使用的是 python 2.7,您可以使用旧样式类来避免这种行为,否则请查看建议线程中的答案以找到一些解决方案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)