运算符重载

下面是可以在类中重载的运算符,以及所需的方法定义,以及表达式中使用的运算符的示例。

NB 使用 other 作为变量名称不是强制性的,但被认为是常态

操作者 方法 表达
+加法 __add__(self, other) a1 + a2
- 减法 __sub__(self, other) a1 - a2
*乘法 __mul__(self, other) a1 * a2
@ 矩阵乘法 __matmul__(self, other) a1 @ a2Python 3.5
/ __div__(self, other) a1 / a2仅限 Python 2
/ __truediv__(self, other) a1 / a2Python 3
// Floor Division __floordiv__(self, other) a1 // a2
% Modulo / Remainder __mod__(self, other) a1 % a2
** Power __pow__(self, other[, modulo]) a1 ** a2
<< 按位左移 __lshift__(self, other) a1 << a2
>> 按位右移 __rshift__(self, other) a1 >> a2
& 按位 AND __and__(self, other) a1 & a2
^ Bitwise XOR __xor__(self, other) a1 ^ a2
|(按位 OR) __or__(self, other) a1 | a2
- 否定(算术) __neg__(self) -a1
+肯定 __pos__(self) +a1
~按位 NOT __invert__(self) ~a1
< 不到 __lt__(self, other) a1 < a2
<= 小于或等于 __le__(self, other) a1 <= a2
== 等于 __eq__(self, other) a1 == a2
!= 不等于 __ne__(self, other) a1 != a2
> 大于 __gt__(self, other) a1 > a2
>= 大于或等于 __ge__(self, other) a1 >= a2
[index] 指数运算符 __getitem__(self, index) a1[index]
in 在运算符 __contains__(self, other) a2 in a1
(*args, ...) 来电 __call__(self, *args, **kwargs) a1(*args, **kwargs)

__pow__ 的可选参数 modulo 仅供 pow 内置函数使用。

对应于二元运算符的每个方法都有一个对应的方法,它以 __r 开头,例如 __radd__

class A:
    def __init__(self, a):
        self.a = a
    def __add__(self, other):
        return self.a + other
    def __radd__(self, other):
        print("radd")
        return other + self.a

A(1) + 2  # Out:  3
2 + A(1)  # prints radd. Out: 3

以及从 __i 开始的相应的原位版本:

class B:
    def __init__(self, b):
        self.b = b
    def __iadd__(self, other):
        self.b += other
        print("iadd")
        return self

b = B(2)
b.b       # Out: 2
b += 1    # prints iadd
b.b       # Out: 3

由于这些方法没有什么特别之处,语言的许多其他部分,标准库的一部分,甚至第三方模块都自己添加了魔术方法,比如将对象强制转换为类型或检查对象属性的方法。例如,内置的 str() 函数调用对象的 __str__ 方法(如果存在)。其中一些用途如下所列。

功能 方法 表达
转换到 int __int__(self) int(a1)
绝对的功能 __abs__(self) abs(a1)
转换到 str __str__(self) str(a1)
转换到 unicode __unicode__(self) unicode(a1)(仅限 Python 2)
字符串表示 __repr__(self) repr(a1)
转换到 bool __nonzero__(self) bool(a1)
字符串格式 __format__(self, formatstr) "Hi {:abc}".format(a1)
哈希 __hash__(self) hash(a1)
长度 __len__(self) len(a1)
反向的 __reversed__(self) reversed(a1)
地板 __floor__(self) math.floor(a1)
天花板 __ceil__(self) math.ceil(a1)

对于上下文管理器,还有特殊方法 __enter____exit__ 等等。