关于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 |