Python中 __radd__ 等运算符的变更

先看下面一段代码

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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容