(轉)一篇文章帶你瞭解Python運算子過載一篇文章帶你瞭解Python運算子過載
原文:https://developer.51cto.com/art/202104/657236.htm
您可以根據所使用的運算元來更改Python中運算子的含義。這種做法稱為運算子過載,今天我們一起來聊聊運算子過載。
一、什麼是Python中的運算子過載?
Python運算子用於內建類。但是相同的運算子對不同的型別有不同的行為。例如,+運算子將對兩個數字執行算術加法、合併兩個列表並連線兩個字串。
Python中的這一功能允許同一運算子根據上下文具有不同的含義,稱為運算子過載。
那麼,當將它們與使用者定義類的物件一起使用時會發生什麼呢?
示例 :下面的類,它試圖在二維座標系中模擬一個點。
- classPoint:
- def__init__(self,x=0,y=0):
- self.x=x
- self.y=y
現在,執行程式碼並嘗試在Python shell中新增兩個點。
- p1=Point(2,3)
- p2=Point(-1,2)
- print(p1+p2)
程式碼:
這是很多錯誤。由於Python不知道如何將兩個Point物件加在一起而引發TypeError。
但是,可以通過運算子過載向Python教授這一點。但是首先,讓對特殊函式有所瞭解。
二、Python中的特殊函式
1. 什麼是特殊模式?
以雙下劃線開頭的類函式在Python中稱為特殊函式。這是因為,它們不是普通的函式。上面定義的init__()函式就是其中之一。每次建立該類的新物件時都會呼叫它。
2. 案例
使用特殊函式,可以使的類與內建函式相容。
例 :
- p1=Point(2,3)
- print(p1)
列印輸出沒有達到預想的效果。
但是,如果在類中定義str()方法,可以控制它的列印輸出方式。把這個加到的類中。
示例
- classPoint:
- def__init__(self,x=0,y=0):
- self.x=x
- self.y=y
- def__str__(self):
- return"({0},{1})".format(self.x,self.y)
現在,讓print()再次嘗試該函式。
- p1=Point(3,7)
- print(p1)
事實證明這樣更好,當使用內建函式str()或時,將呼叫相同的方法format()。
- p1=Point(2,3)
- print(str(p1))
- print(format(p1))
因此,當您執行str(p1)或format(p1)時,Python在內部執行p1.str()。因此得名,特殊函式。下面繼續回到操作符過載。
三、過載+運算子
要過載+符號,將需要在類中實現add()函式。擁有權利的同時也被賦予了重大的責任。可以在此函式內做任何喜歡的事情。但是返回座標和的Point物件是明智的。
示例
- classPoint:
- def__init__(self,x=0,y=0):
- self.x=x
- self.y=y
- def__str__(self):
- return"({0},{1})".format(self.x,self.y)
- def__add__(self,other):
- x=self.x+other.x
- y=self.y+other.y
- returnPoint(x,y)
測試一下:
- p1=Point(2,3)
- p2=Point(-1,2)
- print(p1+p2)
實際上發生的是,當您執行p1 + p2時,Python會呼叫p1 .__ add (p2),也就是Point . add __(p1,p2)。同樣,也可以過載其他運算子。
四、過載比較運算子
Python不限制運算子過載為算術運算子。也可以過載比較運算子。
假設,想在Point類中實現小於運算子(<) ,讓從原點比較這些點的大小,併為此目的返回結果。可以如下實現。
示例
- classPoint:
- def__init__(self,x=0,y=0):
- self.x=x
- self.y=y
- def__str__(self):
- return"({0},{1})".format(self.x,self.y)
- def__lt__(self,other):
- self_mag=(self.x**2)+(self.y**2)
- other_mag=(other.x**2)+(other.y**2)
- returnself_mag<other_mag
嘗試在Python shell中執行這些示例。
- print(Point(1,1)<Point(-2,-3))
- print(Point(1,1)<Point(0.5,-0.2))
- print(Point(1,1)<Point(1,1))
下表列出了需要實現以過載其他比較運算子的特殊函式。
操作符 | 表示式 | 內部 |
---|---|---|
小於(<) | p1 <p2 | p1 .__ lt __(p2) |
小於等於(<=) | p1 <= p2 | p1 .__ le __(p2) |
等於(==) | p1 == p2 | p1 .__ eq __(p2) |
不等於(!=) | p1!= p2 | p1 .__ ne __(p2) |
大於(>) | p1> p2 | p1 .__ gt __(p2) |
大於等於(>=) | p1> = p2 | p1 .__ ge __(p2) |
五、總結
本文基於Python基礎,介紹了Python運算子過載。介紹了什麼是運算子過載?通過案例的分析,進行講解。分模組講解了過載+運算子, 過載比較運算子,在實際案例的應用。
通過豐富的案例分析,效果圖的展示,讓讀者能夠更好理解和學習。
大家積極嘗試,有時候看到別人實現起來很簡單,但是到自己動手實現的時候,總會有各種各樣的問題,切勿眼高手低,勤動手,才可以理解的更加深刻。
程式碼很簡單,希望能夠幫助你學習。
【編輯推薦】
技術連結