2

可能重复:
拦截元类上的运算符查找
如何拦截对新样式类中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__
  • str(a)应该映射到魔术方法 a.__str__()吗?
  • 如果我删除了 custom ClassA.__str__(),那么 ClassA.__getattribute__()仍然没有接听电话。怎么来的?
4

2 回答 2

1

正如 user1579844 所链接的那样,正在发生的事情是新型类避免了 __getattribute__ 的正常查找机制,并在解释器调用它们时直接加载该方法。这样做是出于性能原因,因为这种神奇的方法非常普遍,以至于标准查找会严重降低系统速度。

当您使用点符号显式调用它们时,您将退回到标准查找,因此您首先调用 __getattribute__。

如果您在 python 2.7 中工作,则可以使用旧样式类来避免这种行为,否则请查看建议的线程中的答案以找到一些解决方案。

于 2012-11-22T11:46:06.820 回答
0

当你打电话时

a.__str__ 

它被认为是

__str__

作为构造函数中的项目

def __getattribute__(self, item):
        print 'custom__getattribute__ - ' + item
        return ''

在这一行:

print 'custom__getattribute__ - ' + item  
于 2012-11-22T12:07:00.593 回答