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