運算子過載
下面是可以在類中過載的運算子,以及所需的方法定義,以及表示式中使用的運算子的示例。
NB 使用 other
作為變數名稱不是強制性的,但被認為是常態
操作者 | 方法 | 表達 |
---|---|---|
+ 加法 |
__add__(self, other) |
a1 + a2 |
- 減法 |
__sub__(self, other) |
a1 - a2 |
* 乘法 |
__mul__(self, other) |
a1 * a2 |
@ 矩陣乘法 |
__matmul__(self, other) |
a1 @ a2 ( Python 3.5 ) |
/ 師 |
__div__(self, other) |
a1 / a2 ( 僅限 Python 2 ) |
/ 師 |
__truediv__(self, other) |
a1 / a2 ( Python 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__
等等。