可能重复:
Intercept operator lookup on metaclass
How can I intercept calls to python’s “magic” methods in new style classes?
请考虑以下代码:
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__
str(a)
映射到魔术方法
a.__str__()
?ClassA.__str__()
,那么
ClassA.__getattribute__()
仍未接听电话。怎么样?答案 0 :(得分:1)
由user1579844链接发生的事情是新式类避免了__getattribute__的正常查找机制,并在解释器调用它时直接加载该方法。这是出于性能原因而完成的,这是一种非常常见的神奇方法,标准查找会使系统速度变慢。
当您使用点表示法显式调用它们时,您将回退到标准查找,因此首先调用__getattribute__。
如果您使用的是python 2.7,则可以使用旧样式类来避免此行为,否则请查看建议的线程中的答案以找到解决方案。
答案 1 :(得分:0)
当你打电话
a.__str__
它被认为是
__str__
在构造函数中作为项。
def __getattribute__(self, item):
print 'custom__getattribute__ - ' + item
return ''
在这一行:
print 'custom__getattribute__ - ' + item