運算子過載

Jinku Hu 2020年6月25日
運算子過載

運算子過載

Python 中的一切都是物件,每個物件都有一些特殊的內部方法,用於與其他物件進行互動。通常,這些方法遵循 __action__ 命名約定。

你可以過載這些方法中的任何一種。這通常用於 Python 中的運算子過載。下面是使用 Python 資料模型進行運算子過載的示例。在 Vector 類建立有兩個變數的簡單向量。我們將使用運算子過載來支援兩個向量的數學運算。

class Vector(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __add__(self, v):
        # Addition with another vector.
        return Vector(self.x + v.x, self.y + v.y)

    def __sub__(self, v):
        # Subtraction with another vector.
        return Vector(self.x - v.x, self.y - v.y)

    def __mul__(self, s):
        # Multiplication with a scalar.
        return Vector(self.x * s, self.y * s)

    def __div__(self, s):
        # Division with a scalar.
        float_s = float(s)
        return Vector(self.x / float_s, self.y / float_s)

    def __floordiv__(self, s):
        # Division with a scalar (value floored).
        return Vector(self.x // s, self.y // s)

    def __repr__(self):
        # Print friendly representation of Vector class. Else, it would
        # show up like, <__main__.Vector instance at 0x01DDDDC8>.
        return "<Vector (%f, %f)>" % (
            self.x,
            self.y,
        )


a = Vector(3, 5)
b = Vector(2, 7)

print a + b  # Output: <Vector (5.000000, 12.000000)>
print b - a  # Output: <Vector (-1.000000, 2.000000)>
print b * 1.3  # Output: <Vector (2.600000, 9.100000)>
print a // 17  # Output: <Vector (0.000000, 0.000000)>
print a / 17  # Output: <Vector (0.176471, 0.294118)>

通過運算子過載,我們可以讓類進行一些數學運算,假如這些運算經常被呼叫到的話,這樣就省去了通過函式來實現的步驟。

具體的可支援過載的運算子列表可以參見官方手冊

作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 創辦人。Jinku 在機器人和汽車行業工作了8多年。他在自動測試、遠端測試及從耐久性測試中創建報告時磨練了自己的程式設計技能。他擁有電氣/ 電子工程背景,但他也擴展了自己的興趣到嵌入式電子、嵌入式程式設計以及前端和後端程式設計。

LinkedIn Facebook