<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          一篇文章帶你了解Python運(yùn)算符重載

          共 2965字,需瀏覽 6分鐘

           ·

          2021-04-20 02:31

          點(diǎn)擊上方“Go語(yǔ)言進(jìn)階學(xué)習(xí)”,進(jìn)行關(guān)注

          回復(fù)“Go語(yǔ)言”即可獲贈(zèng)從入門到進(jìn)階共10本電子書(shū)

          不堪玄鬢影,來(lái)對(duì)白頭吟。


          您可以根據(jù)所使用的操作數(shù)來(lái)更改Python中運(yùn)算符的含義。這種做法稱為運(yùn)算符重載,今天我們一起來(lái)聊聊運(yùn)算符重載。


          一、什么是Python中的運(yùn)算符重載?

          Python運(yùn)算符用于內(nèi)置類。但是相同的運(yùn)算符對(duì)不同的類型有不同的行為。例如,+運(yùn)算符將對(duì)兩個(gè)數(shù)字執(zhí)行算術(shù)加法、合并兩個(gè)列表并連接兩個(gè)字符串。

          Python中的這一功能允許同一運(yùn)算符根據(jù)上下文具有不同的含義,稱為運(yùn)算符重載。

          那么,當(dāng)將它們與用戶定義類的對(duì)象一起使用時(shí)會(huì)發(fā)生什么呢?

          示例   :下面的類,它試圖在二維坐標(biāo)系中模擬一個(gè)點(diǎn)。

          class Point:    def __init__(self, x = 0, y = 0):        self.x = x        self.y = y

          現(xiàn)在,運(yùn)行代碼并嘗試在Python shell中添加兩個(gè)點(diǎn)。

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

          代碼:

          這是很多錯(cuò)誤。由于Python不知道如何將兩個(gè)Point對(duì)象加在一起而引發(fā)TypeError。

          但是,可以通過(guò)運(yùn)算符重載向Python教授這一點(diǎn)。但是首先,讓對(duì)特殊函數(shù)有所了解。


          二、Python中的特殊函數(shù)

          1.  什么是特殊模式?

          以雙下劃線開(kāi)頭的類函數(shù)在Python中稱為特殊函數(shù)。這是因?yàn)椋鼈儾皇瞧胀ǖ暮瘮?shù)。上面定義的init__()函數(shù)就是其中之一。每次創(chuàng)建該類的新對(duì)象時(shí)都會(huì)調(diào)用它。

          2. 案例

          使用特殊函數(shù),可以使的類與內(nèi)置函數(shù)兼容。

          例 :

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

          打印輸出沒(méi)有達(dá)到預(yù)想的效果。

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

          示例

          class Point:    def __init__(self, x = 0, y = 0):        self.x = x        self.y = y        def __str__(self):        return "({0},{1})".format(self.x,self.y)

          現(xiàn)在,讓print()再次嘗試該函數(shù)。

          p1 = Point(3,7)print(p1)

          事實(shí)證明這樣更好,當(dāng)使用內(nèi)置函數(shù)str()或時(shí),將調(diào)用相同的方法format()。

          p1 = Point(23)print(str(p1))print(format(p1))

          因此,當(dāng)您執(zhí)行str(p1)或format(p1)時(shí),Python在內(nèi)部執(zhí)行p1.str()。因此得名,特殊函數(shù)。下面繼續(xù)回到操作符重載。


          三、重載+運(yùn)算符

          要重載+符號(hào),將需要在類中實(shí)現(xiàn)add()函數(shù)。擁有權(quán)利的同時(shí)也被賦予了重大的責(zé)任。可以在此函數(shù)內(nèi)做任何喜歡的事情。但是返回坐標(biāo)和的Point對(duì)象是明智的。

          示例

          class Point:    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        return Point(x,y)

          測(cè)試一下:

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

          實(shí)際上發(fā)生的是,當(dāng)您執(zhí)行p1 + p2時(shí),Python會(huì)調(diào)用p1 .__ add (p2),也就是Point . add __(p1,p2)。同樣,也可以重載其他運(yùn)算符。


          四、重載比較運(yùn)算符

          Python不限制運(yùn)算符重載為算術(shù)運(yùn)算符。也可以重載比較運(yùn)算符。

          假設(shè),想在Point類中實(shí)現(xiàn)小于運(yùn)算符(<) ,讓從原點(diǎn)比較這些點(diǎn)的大小,并為此目的返回結(jié)果。可以如下實(shí)現(xiàn)。

          示例

          class Point:    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)        return self_mag < other_mag

          嘗試在Python shell中運(yùn)行這些示例。

          print(Point(1, 1) < Point(-2, -3))
          print(Point(1, 1) < Point(0.5, -0.2))
          print(Point(1, 1) < Point(1, 1))

          下表列出了需要實(shí)現(xiàn)以重載其他比較運(yùn)算符的特殊函數(shù)。

          操作符表達(dá)式內(nèi)部
          小于(<)p1 <p2p1 .__ lt __(p2)
          小于等于(<=)p1 <= p2p1 .__ le __(p2)
          等于(==)p1 == p2p1 .__ eq __(p2)
          不等于(!=)p1!= p2p1 .__ ne __(p2)
          大于(>)p1> p2p1 .__ gt __(p2)
          大于等于(>=)p1> = p2p1 .__ ge __(p2)

          五、總結(jié)

          本文基于Python基礎(chǔ),介紹了Python運(yùn)算符重載。介紹了什么是運(yùn)算符重載?通過(guò)案例的分析,進(jìn)行講解。分模塊講解了重載+運(yùn)算符, 重載比較運(yùn)算符,在實(shí)際案例的應(yīng)用。

          通過(guò)豐富的案例分析,效果圖的展示,讓讀者能夠更好理解和學(xué)習(xí)。

          大家積極嘗試,有時(shí)候看到別人實(shí)現(xiàn)起來(lái)很簡(jiǎn)單,但是到自己動(dòng)手實(shí)現(xiàn)的時(shí)候,總會(huì)有各種各樣的問(wèn)題,切勿眼高手低,勤動(dòng)手,才可以理解的更加深刻。

          代碼很簡(jiǎn)單,希望能夠幫助你學(xué)習(xí)。

          ------------------- End -------------------

          往期精彩文章推薦:

          歡迎大家點(diǎn)贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持

          想加入Python學(xué)習(xí)群請(qǐng)?jiān)诤笈_(tái)回復(fù)【入群

          萬(wàn)水千山總是情,點(diǎn)個(gè)【在看】行不行

          /今日留言主題/

          隨便說(shuō)一兩句吧~

          瀏覽 56
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  北条麻妃91 | 国产一级搞鸡 | 成人网址在线看 | 久久亚洲AV成人无码国产精品 | 成人区精品一区二区婷婷255 |