運算子過載

下面是可以在類中過載的運算子,以及所需的方法定義,以及表示式中使用的運算子的示例。

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__ 等等。