python内置函数vs魔术函数和重写

时间:2012-11-22 11:07:00

标签: python override magic-function

  

可能重复:
  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__()仍未接听电话。怎么样?

2 个答案:

答案 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