06.14 Python 魔術方法和運算符重載

Python 魔術方法和運算符重載

Python 的魔術方法其實也不是什麼魔法。

魔術方法的名稱前後各有兩個下劃線,例如類初始化函數 __init__ 就是個魔術方法。你不必直接調用它,當初始化一個類的時候,Python 背後會自動執行 __init__ 方法。

例如一條語句:x = A(),就會自動執行類 A 的魔術方法 __new__ 和 __init__。查看下面例子:

Python 魔術方法和運算符重載

輸出:

Python 魔術方法和運算符重載

使用語句 a = A(1, 2, foo='bar') 創建對象,會自動執行類 A 的 __new__ 和 __init__ 方法。

__new__ 方法打印了輸入參數,最後調用 return super().__new__(cls) 獲取對象。

__init__ 方法的第一個參數 self 正是 __new__ 方法創建的實例對象。

__call__ 方法


__call__ 方法可以使類的實例像對象像函數那樣調用,正常函數(Function)是可調用的(callable),實現了__call__ 方法的對象,也是可調用的(callable object)。

下面的代碼定義了一個類,它的實例可調用:

Python 魔術方法和運算符重載

類 A 接收一個初始化參數 x,然後定義了 __call__ 方法,接收一個參數,返回兩個參數之和。

使用 a = A(10) 實例化對象後,對象 a 可以像函數一樣調用,輸入值2,然後調用 __call__方法,和對象的屬性 x 相加得12

運算符重載


運算符加號 +,當兩個整數類型相加,返回他們的和。 當兩個序列類型相加,返回一個新序列,包含所有的值。

Python 魔術方法和運算符重載

我們也可以重載 + 運算符運用在自己創建的類中,達到特殊的目的。要想實現這樣的操作,需要定義和運算符相關的魔術方法,例如加法 + 對應的魔術方法是 __add__,減號 - 對應的魔術方法是 __sub__。如果忘記定義,會拋出類型錯誤異常。

Python 魔術方法和運算符重載

以上沒有定義任何魔術方法的類,實例相加拋出類型錯誤,不支持的運算符類型 +

運算符魔術方法概覽


二元運算符 Binary Operaters

Python 魔術方法和運算符重載

擴展賦值運算符 Extended Assignment

Python 魔術方法和運算符重載

一元運算符 Unary Operator

Python 魔術方法和運算符重載

比較操作符 Comparison Operator

Python 魔術方法和運算符重載

例子


下面的例子實現了加法 + 的運算符重載。

Python 魔術方法和運算符重載

類 A 實例化了兩個對象,對象相加調用魔術方法 __add__,返回兩個對象的屬性 x 的和。


分享到:


相關文章: