一種運算子對於不同型別的物件,有不同的使用方式。例如,+
用於整型物件,表示兩個數相加;用於字串,表示連線這兩個字串。
x, y =10,
20print
(x + y)
# 30
a,b =
'john'
,'wick'
print
(a + b)
# john wick
+
運算子因操作物件的型別的不同而執行不同的操作,這種特性稱為過載。
運算子的功能因其運算元據的型別而異,我們稱之為過載。
+
運算子可以用於任意兩個物件的相加嗎?我們來試試看。
class
vector
:def
__init__
(self, x, y)
: self.x = x
self.y = y
v1 = vector(3,
4)v2 = vector(5,
6)v1 + v2--
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
-typeerror traceback (most recent call last)
input-3
-08104d7e1232
>
in--
-->
1 v1 + v2
typeerror: unsupported operand type
(s)for+:
'vector'
and'vector'
執行這段**會報錯。為什麼呢?這是因為+
運算子不知道如何把兩個 vector 類的物件相加。
在本文中,我們將研究如何將既有的運算子用於自定義物件的操作,同時我們要牢記 python 語言對操作符過載的一些限制性規則。
這些限制性規則有:
不允許建立新的運算子,只能過載已有的那些運算子
不允許過載已有資料型別(如 tuple 、 string 、 list)的某些運算子操作
某些運算子不能過載,例如 is, or, and, not
在開始學習運算子過載前,我們需要了解 python 資料模型 和 特殊方法。
python 資料模型可以看作一種 「python 設計方式」或 「python 框架」。它告訴你 python 如何管理物件以及如何對它們進行操作。它描述了一系列 api,你可以使用這些 api 使你定義的物件具備已有資料型別的某些功能,並且可以使用大多數 python 語言的特性,而且不必實現它們。
特殊方法→
當你使用 len(collection),python 直譯器呼叫的是collection.len()
方法。這裡的 len() 就是乙個特殊方法。
特殊方法開頭和結尾都是__
,意為只能由 python 直譯器呼叫,除非你在進行元程式設計,不然不要直接呼叫它。
在 python 語言中,我們可以使用特殊方法來實現運算子過載。
現在我們進行編碼,使 vector 物件支援+
運算子。
當我們呼叫+
這個運算子時,python 直譯器呼叫了add(self, other)
這個特殊方法。所以,在我們定義的類中實現 add() 方法,就可以支援+
運算子。
'''
'''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(, )'
v1 = vector(3,
4)v2 = vector(5,
6)v1 + v2
>>
> output: vector(8,
10)
你會發現,我們的類已經支援+
運算子,在這個類中還實現了 repr() 方法,當我們呼叫 print() 方法,直譯器呼叫 str() 方法,如果我們沒有提供 repr() 的實現,就會呼叫原來的 repr() 方法。
注意:除了過載類似於+=
的賦值運算子外,一定要返回乙個新建的物件。
再舉個過載運算子的例子
當我們使用==
運算子時,python 直譯器會呼叫eq(self, other)
這個特殊方法,所以我們通過實現eq()
方法就可以使某個類支援==
運算子。
'''
'''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(, )'
def__eq__
(self, other)
:return self.x == other.x and self.y == other.y
v1 = vector(3,
4)v2 = vector(5,
6)v1 == v2
>>
> output:
false
v3 = vector(3,
4)v1 == v3
>>
> output:
true
在 python 中,使用特殊方法可以輕鬆實現運算子過載。關鍵在於理解資料模型和特殊方法。
這些方法能讓你從 python 的慣用特性中受益,並且能利用強大的標準庫。
總結
我們從理解什麼是運算子過載開始,接著討論了 python 中運算子過載的一些限制條件、資料模型和特殊方法,然後在 vector 類中實現了運算子過載。
python中的運算子過載
學過c 的都知道我們在類中可以對運算子進行過載,以使運算子實現自己所需要的功能 自然在python中也可以實現運算子的過載 方法名 過載的操作說明 呼叫表示式 init 建構函式 建立物件 class del 析構函式 釋放物件的時候 add x y or x y repr 列印,轉換 print ...
Python 運算子過載
在 python 中is 是兩個運算子,對物件進行比較,分別對id,type value 進行比較。is 比較id type value三維 而 僅 比較value。實驗發現其實is,僅僅是比較一些簡單的基礎變數。class test object def init self self.value ...
Python運算子過載
print 呼叫父類建構函式 def parentmethod self print 呼叫父類方法 def setattr self,attr self.parentattr attr def getattr self print 父類屬性 self.parentattr def del self ...