新式课程的操作员

时间:2014-11-14 07:33:10

标签: python class python-2.7 operator-overloading

有人可以向我解释为什么A()+A()确实会出错,但B()+B()会按预期工作吗?当我编写更大的代码时,我遇到了这个问题,但这似乎是重现代码所需的最小代码。

from types import MethodType

D = {'__add__': lambda x, y: "".join((repr(x), repr(y)))}

class A(object):
    def __getattr__(self, item):
        if item == '__coerce__':
            raise AttributeError()
        return MethodType(D[item], self)
    def __repr__(self):
        return "A"

class B():
    def __getattr__(self, item):
        if item == '__coerce__':
            raise AttributeError()
        return MethodType(D[item], self)
    def __repr__(self):
        return "B"

try:
    A()+A()
except Exception as e:
    print e

B()+B()

有没有人有解释?

1 个答案:

答案 0 :(得分:5)

这是因为新样式类永远不会使用二元运算符调用__coerce__。此外,对于特殊方法__getattr__永远不会在新样式类中调用:来自数据模型coercion rules

  

新式类(从对象派生的类)永远不会调用   响应二元运算符的__coerce__()方法;调用内置函数__coerce__()的唯一时间coerce()