本篇是 Python 系列教程第 12 篇,更多內容敬請訪問我的 Python 合集
在理解運算子過載之前我們已經知道了什麼是方法過載,方法過載就是子類繼承父類並且定義了一個和父類一樣的方法。
知道了什麼是過載,也知道了什麼是運算子(加減乘除等),那麼運算子過載也很好理解了,其實就是在類裡面也定義一些特殊方法,使得呼叫這些方法能實現類物件的加減乘除。當然方法名不是隨意取的,要和運算子對應上。
以下是一些常見的運算子及其對應的特殊方法:
- 加法 (
+
):__add__(self, other)
- 減法 (
-
):__sub__(self, other)
- 乘法 (
*
):__mul__(self, other)
- 除法 (
/
):__truediv__(self, other)
- 求模 (
%
):__mod__(self, other)
- 冪 (
**
):__pow__(self, other[, modulo])
- 比較 (
==
):__eq__(self, other)
- 小於 (
<
):__lt__(self, other)
- 大於 (
>
):__gt__(self, other)
- 反向運算子(例如
a + b
中的b + a
):__radd__(self, other)
等
這裡有一個簡單的例子,展示了一個類如何過載加法運算子:
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __add__(self, other):
return Vector(self.x + other.x, self.y + other.y)
def __repr__(self):
return f"Vector({self.x}, {self.y})"
# 建立兩個向量例項
v1 = Vector(1, 2)
v2 = Vector(3, 4)
# 使用加法運算子
result = v1 + v2
print(result) # 輸出: Vector(4, 6)
在這個例子中,我們定義了一個Vector
類,並實現了__add__
方法來處理加法運算。此外,我們還定義了__repr__
方法以便列印出物件的可讀表示形式。關於__repr__
方法的介紹請看文章末尾。
擴充
__repr__
方法不是典型的運算子過載方法,但它確實是一種特殊的方法,用於定義物件的“官方”字串表示形式。這個方法通常用於除錯和開發目的,因為它提供了關於物件的儘可能完整的資訊。
當沒有定義 __str__
方法時,print()
和 str()
會呼叫 __repr__
方法來獲取物件的字串表示。即使定義了 __str__
方法,__repr__
也可以被直接呼叫,比如使用 repr()
函式。
我們在上面的例子中做一個擴充:
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __add__(self, other):
return Vector(self.x + other.x, self.y + other.y)
def __repr__(self):
return f"repr Vector({self.x}, {self.y})"
def __str__(self):
return f"str Vector({self.x}, {self.y})"
# 建立兩個向量例項
v1 = Vector(1, 2)
v2 = Vector(3, 4)
# 使用加法運算子
result = v1 + v2
print(result) # 輸出: str Vector(4, 6)
print(repr(result)) # 輸出:repr Vector(4, 6)
在這個例子中,__repr__
被用來返回一個包含 x
和 y
座標的字串,這使得輸出更具可讀性。
雖然 __repr__
不是用來過載算術或比較運算子的,但它可以被認為是一種形式的“方法過載”,因為它允許你自定義物件如何被轉換成字串形式。如果你有任何關於 __repr__
或者其他特殊方法的具體問題,請隨時提問!