1. 程式人生 > 其它 >(轉)一篇文章帶你瞭解Python運算子過載一篇文章帶你瞭解Python運算子過載

(轉)一篇文章帶你瞭解Python運算子過載一篇文章帶你瞭解Python運算子過載

原文:https://developer.51cto.com/art/202104/657236.htm

您可以根據所使用的運算元來更改Python中運算子的含義。這種做法稱為運算子過載,今天我們一起來聊聊運算子過載。

一、什麼是Python中的運算子過載?

Python運算子用於內建類。但是相同的運算子對不同的型別有不同的行為。例如,+運算子將對兩個數字執行算術加法、合併兩個列表並連線兩個字串。

Python中的這一功能允許同一運算子根據上下文具有不同的含義,稱為運算子過載。

那麼,當將它們與使用者定義類的物件一起使用時會發生什麼呢?

示例 :下面的類,它試圖在二維座標系中模擬一個點。

  1. classPoint:
  2. def__init__(self,x=0,y=0):
  3. self.x=x
  4. self.y=y

現在,執行程式碼並嘗試在Python shell中新增兩個點。

  1. p1=Point(2,3)
  2. p2=Point(-1,2)
  3. print(p1+p2)

程式碼:

這是很多錯誤。由於Python不知道如何將兩個Point物件加在一起而引發TypeError。

但是,可以通過運算子過載向Python教授這一點。但是首先,讓對特殊函式有所瞭解。

二、Python中的特殊函式

1. 什麼是特殊模式?

以雙下劃線開頭的類函式在Python中稱為特殊函式。這是因為,它們不是普通的函式。上面定義的init__()函式就是其中之一。每次建立該類的新物件時都會呼叫它。

2. 案例

使用特殊函式,可以使的類與內建函式相容。

例 :

  1. p1=Point(2,3)
  2. print(p1)

列印輸出沒有達到預想的效果。

但是,如果在類中定義str()方法,可以控制它的列印輸出方式。把這個加到的類中。

示例

  1. classPoint:
  2. def__init__(self,x=0,y=0):
  3. self.x=x
  4. self.y=y
  5. def__str__(self):
  6. return"({0},{1})".format(self.x,self.y)

現在,讓print()再次嘗試該函式。

  1. p1=Point(3,7)
  2. print(p1)

事實證明這樣更好,當使用內建函式str()或時,將呼叫相同的方法format()。

  1. p1=Point(2,3)
  2. print(str(p1))
  3. print(format(p1))

因此,當您執行str(p1)或format(p1)時,Python在內部執行p1.str()。因此得名,特殊函式。下面繼續回到操作符過載。

三、過載+運算子

要過載+符號,將需要在類中實現add()函式。擁有權利的同時也被賦予了重大的責任。可以在此函式內做任何喜歡的事情。但是返回座標和的Point物件是明智的。

示例

  1. classPoint:
  2. def__init__(self,x=0,y=0):
  3. self.x=x
  4. self.y=y
  5. def__str__(self):
  6. return"({0},{1})".format(self.x,self.y)
  7. def__add__(self,other):
  8. x=self.x+other.x
  9. y=self.y+other.y
  10. returnPoint(x,y)

測試一下:

  1. p1=Point(2,3)
  2. p2=Point(-1,2)
  3. print(p1+p2)

實際上發生的是,當您執行p1 + p2時,Python會呼叫p1 .__ add (p2),也就是Point . add __(p1,p2)。同樣,也可以過載其他運算子。

四、過載比較運算子

Python不限制運算子過載為算術運算子。也可以過載比較運算子。

假設,想在Point類中實現小於運算子(<) ,讓從原點比較這些點的大小,併為此目的返回結果。可以如下實現。

示例

  1. classPoint:
  2. def__init__(self,x=0,y=0):
  3. self.x=x
  4. self.y=y
  5. def__str__(self):
  6. return"({0},{1})".format(self.x,self.y)
  7. def__lt__(self,other):
  8. self_mag=(self.x**2)+(self.y**2)
  9. other_mag=(other.x**2)+(other.y**2)
  10. returnself_mag<other_mag

嘗試在Python shell中執行這些示例。

  1. print(Point(1,1)<Point(-2,-3))
  2. print(Point(1,1)<Point(0.5,-0.2))
  3. 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運算子過載。介紹了什麼是運算子過載?通過案例的分析,進行講解。分模組講解了過載+運算子, 過載比較運算子,在實際案例的應用。

通過豐富的案例分析,效果圖的展示,讓讀者能夠更好理解和學習。

大家積極嘗試,有時候看到別人實現起來很簡單,但是到自己動手實現的時候,總會有各種各樣的問題,切勿眼高手低,勤動手,才可以理解的更加深刻。

程式碼很簡單,希望能夠幫助你學習。

【編輯推薦】

  1. 鴻蒙官方戰略合作共建——HarmonyOS技術社群
  2. 一日一技:為 Python 專案編寫 Makefile
  3. Python提取 Excel內容,這個需求頭一次見,千個表,十行程式碼
  4. 15個讓新手愛不釋手的Python高階庫
  5. 【李寧】Python函式庫深度詳解(1)
  6. 跟李寧老師學Python視訊課程(12):Python常用模組
技術連結