先看下面一段代碼
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__ 等被重載的運(yùn)算符,在滿足下面兩種情況下才會(huì)被調(diào)用
- 兩個(gè)操作數(shù)類型不同
- 左邊的操作數(shù)沒有實(shí)現(xiàn)__add__方法或 __add__ 返回 NotImplemented