12 Python物件導向程式設計:運算子過載

救苦救难韩天尊發表於2024-09-05

本篇是 Python 系列教程第 12 篇,更多內容敬請訪問我的 Python 合集

在理解運算子過載之前我們已經知道了什麼是方法過載,方法過載就是子類繼承父類並且定義了一個和父類一樣的方法。

知道了什麼是過載,也知道了什麼是運算子(加減乘除等),那麼運算子過載也很好理解了,其實就是在類裡面也定義一些特殊方法,使得呼叫這些方法能實現類物件的加減乘除。當然方法名不是隨意取的,要和運算子對應上。

以下是一些常見的運算子及其對應的特殊方法:

  1. 加法 (+): __add__(self, other)
  2. 減法 (-): __sub__(self, other)
  3. 乘法 (*): __mul__(self, other)
  4. 除法 (/): __truediv__(self, other)
  5. 求模 (%): __mod__(self, other)
  6. 冪 (**): __pow__(self, other[, modulo])
  7. 比較 (==): __eq__(self, other)
  8. 小於 (<): __lt__(self, other)
  9. 大於 (>): __gt__(self, other)
  10. 反向運算子(例如 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__ 被用來返回一個包含 xy 座標的字串,這使得輸出更具可讀性。

雖然 __repr__ 不是用來過載算術或比較運算子的,但它可以被認為是一種形式的“方法過載”,因為它允許你自定義物件如何被轉換成字串形式。如果你有任何關於 __repr__ 或者其他特殊方法的具體問題,請隨時提問!

相關文章