先看下面一段代码
class Case:
def __radd__(self, other):
return 1
print(Case() + Case())
python2.7.10 中打印的值为
print(Case() + Case())// -> 1
python 3.6中打印的值为
print(Case() + Case())// -> TypeError: unsupported operand type(s)
官方文档中有一段说明
These methods are called to implement the binary arithmetic operations (+, -, *, @, /, //, %, divmod(), pow(), **, <<, >>, &, ^, |) with reflected (swapped) operands. These functions are only called if the left operand does not support the corresponding operation [3] and the operands are of different types. [4] For instance, to evaluate the expression x - y, where y is an instance of a class that has an rsub() method, y.rsub(x) is called if x.sub(y) returns NotImplemented.
大意是在python3中,像 __radd__, __rmul__ 等被重载的运算符,在满足下面两种情况下才会被调用
- 两个操作数类型不同
- 左边的操作数没有实现__add__方法或 __add__ 返回 NotImplemented