0%

Python:重载运算符

关于Python运算符重载,大家可以参考Data model

重载一元运算符

运算符 函数 说明
+ __pos__ 一元取正算术运算符
- __neg__ 一元取负算术运算符
~ __invert__ 对整数按位取反

重载二元运算符

运算符 正向函数 反向函数 增量函数 说明
+ __add__ __radd__ __iadd__ 加法或拼接
- __sub__ __rsub__ __isub__ 减法
* __mul__ __rmul__ __imul__ 乘法或重复复制
/ __truediv__ __rtruediv__ __itruediv__ 除法
// __floordiv__ __rfloordiv__ __ifloordiv__ 整除
% __mod__ __rmod__ __imod__ 取模
**, pow() __pow__ __rpow__ __ipow__ 取幂
@ __matmul__ __rmatmul__ __imatmul__ 矩阵乘法
& __and__ __rand__ __iand__ 位与
| __or__ __ror__ __ior__ 位或
^ __xor__ __rxor__ __ixor__ 位异或
<< __lshift__ __rlshift__ __ilshift__ 按位左移
>> __rshift__ __rrshift__ __irshift__ 按位右移

在这里说明一下Python解释器的执行机制。对于表达式a + b来说:

  • 如果a__add__函数且返回值不是NotImplemented(一个特殊的单例值,不是异常),调用a.__add__(b),然后返回结果;
  • 如果a没有__add__函数,b__radd__函数且返回值不是NotImplemented,调用b.__radd__(a),然后返回结果;
  • 如果b没有__radd__函数或者返回值是NotImplemented,抛出TypeError异常,并在错误消息中指明操作数类型不支持。

关于增量函数,对于表达式a += b来说:

  • 如果a没有实现__iadd__函数,那么a += b等价于a = a + b
  • 如果a实现了__iadd__函数,调用a.__iadd__(b)函数,它会直接修改左操作数a,而不是创建新对象作为返回值。

重载比较运算符

运算符 正向函数 反向函数 后备机制
== __eq__ __eq__ 返回id(a) == id(b)
!= __ne__ __ne__ 返回not (a == b)
> __gt__ __lt__ 抛出TypeError
< __lt__ __gt__ 抛出TypeError
>= __ge__ __le__ 抛出TypeError
<= __le__ __ge__ 抛出TypeError