Python運(yùn)算符重載的簡(jiǎn)單實(shí)例代碼
什么是運(yùn)算符重載
讓自定義的類生成的對(duì)象(實(shí)例)能夠使用運(yùn)算符進(jìn)行操作
作用:
讓自定義的實(shí)例像內(nèi)建對(duì)象一樣進(jìn)行運(yùn)算符操作
讓程序簡(jiǎn)潔易讀
對(duì)自定義對(duì)象將運(yùn)算符賦予新的規(guī)則
算術(shù)運(yùn)算符的重載:
方法名 運(yùn)算符和表達(dá)式 說(shuō)明
__add__(self,rhs) self + rhs 加法
__sub__(self,rhs) self - rhs 減法
__mul__(self,rhs) self * rhs 乘法
__truediv__(self,rhs) self / rhs 除法
__floordiv__(self,rhs) self //rhs 地板除
__mod__(self,rhs) self % rhs 取模(求余)
__pow__(self,rhs) self **rhs 冪運(yùn)算
以__pow__為例
class Achievement(object): def __init__(self,achievement): self.achievement=achievement def __pow__(self,other): return self.achievement**other.achievement achievement01=Achievement(20) achievement02=Achievement(20) print(pow(achievement01,achievement02))
打印輸出的便是兩個(gè)成績(jī)的乘方104857600000000000000000000,其他運(yùn)算符重載的基本步驟和__pow__大致相同。
python 3 的版本中已經(jīng)沒(méi)有cmp函數(shù),被operator模塊代替,在交互模式下使用時(shí),需要導(dǎo)入模塊。
import operator operator.le(a, b) operator.eq(a, b) operator.ne(a, b) operator.ge(a, b) operator.gt(a, b) operator.__lt__(a, b) operator.__le__(a, b) operator.__eq__(a, b) operator.__ne__(a, b) operator.__ge__(a, b) operator.__gt__(a, b)
這幾個(gè)函數(shù)就是用來(lái)替換之前的cmp的,先簡(jiǎn)單說(shuō)下這幾個(gè)函數(shù)的意思吧
lt(a,b) 相當(dāng)于 a<b 數(shù)字或字母(ASCII)比大小
le(a,b)相當(dāng)于a<=b
eq(a,b)相當(dāng)于a==b 字母完全一樣,返回True,
ne(a,b)相當(dāng)于a!=b
gt(a,b)相當(dāng)于a>b
ge(a,b)相當(dāng)于 a>=b
函數(shù)的返回值是布爾類型
但是我們可以用運(yùn)算符重載來(lái)復(fù)現(xiàn)cmp的功能
例:
class Achievement(object): def __init__(self,achievement01,achievement02): self.achievement01=achievement01 self.achievement02=achievement02 def cmp(self): if self.achievement01>self.achievement02: print(self.achievement01,">",self.achievement02) return 1 elif self.achievement01<self.achievement02: print(self.achievement01,"<",self.achievement02) return -1 elif self.achievement01==self.achievement02: print(self.achievement01,"=",self.achievement02) return 0
main.py:
from demo01 import * def main(): Achievement01=Achievement(100,50) Achievement01.cmp() if __name__=="__main__": main()
上述例子中我在成績(jī)類中寫(xiě)了一個(gè)cmp函數(shù),因?yàn)閜ython3中已經(jīng)棄用了cmp函數(shù),所以我們完全可以不按照標(biāo)準(zhǔn)的運(yùn)算符重載寫(xiě)成__cmp__,直接函數(shù)名cmp即可,這樣我們就又可以使用cmp函數(shù)了。
在主函數(shù)中傳入成績(jī)100和50,調(diào)用cmp函數(shù),輸出結(jié)果為100>50
反向運(yùn)算符的重載
當(dāng)運(yùn)算符的左側(cè)為內(nèi)建類型時(shí),右側(cè)為自定義類型進(jìn)行算術(shù)勻算符運(yùn)算時(shí)會(huì)出現(xiàn)TypeError錯(cuò)誤,因?yàn)闊o(wú)法修改內(nèi)建類型的代碼 實(shí)現(xiàn)運(yùn)算符重載,此時(shí)需要使用反向運(yùn)算符的重載
反向算術(shù)運(yùn)算符的重載:
方法名 運(yùn)算符和表達(dá)式 說(shuō)明
__radd__(self,lhs) lhs + self 加法
__rsub__(self,lhs) lhs - self 減法
__rmul__(self,lhs) lhs * self 乘法
__rtruediv__(self,lhs) lhs / self 除法
__rfloordiv__(self,lhs) lhs // self 地板除
__rmod__(self,lhs) lhs % self 取模(求余)
__rpow__(self,lhs) lhs ** self 冪運(yùn)算
示例:
class Mylist: def __init__(self, iterable=()): self.data = list(iterable) def __repr__(self): return 'Mylist(%s)' % self.data def __add__(self, lst): print('__add__被調(diào)用') return Mylist(self.data + lst.data) def __mul__(self, rhs): # rhs為int類型,不能用rhs.data print('__mul__被調(diào)用') return Mylist(self.data * rhs) def __rmul__(self, lhs): print("__rmul__被調(diào)用") return Mylist(self.data * lhs) L1 = Mylist([1, 2, 3]) L2 = Mylist([4, 5, 6]) L3 = 3 * L1 print(L3) L1 += L2 print(L1) L2 *= 3 print(L2)
總結(jié)
到此這篇關(guān)于Python運(yùn)算符重載的文章就介紹到這了,更多相關(guān)Python運(yùn)算符重載內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python數(shù)據(jù)提取BeautifulSoup的概念語(yǔ)法及使用優(yōu)點(diǎn)詳解
這篇文章主要為大家介紹了python數(shù)據(jù)提取BeautifulSoup概念語(yǔ)法及使用優(yōu)點(diǎn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-02-02python實(shí)現(xiàn)秒殺商品的微信自動(dòng)提醒功能(代碼詳解)
這篇文章主要介紹了python實(shí)現(xiàn)秒殺商品的微信自動(dòng)提醒功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04如何搜索查找并解決Django相關(guān)的問(wèn)題
每個(gè)程序員都會(huì)在開(kāi)發(fā)過(guò)程中遇到這樣或那樣的問(wèn)題, 有時(shí)光靠一個(gè)人是無(wú)法解決所有問(wèn)題的, 所以我們應(yīng)該找到適當(dāng)?shù)牡胤教釂?wèn).2014-06-06簡(jiǎn)述Python中的進(jìn)程、線程、協(xié)程
這篇文章主要介紹了Python中的進(jìn)程、線程、協(xié)程的相關(guān)資料,需要的朋友可以參考下2016-03-03Python matplotlib學(xué)習(xí)筆記之坐標(biāo)軸范圍
這篇文章主要介紹了Python matplotlib學(xué)習(xí)筆記之坐標(biāo)軸范圍,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06PyTorch深度學(xué)習(xí)LSTM從input輸入到Linear輸出
這篇文章主要為大家介紹了PyTorch深度學(xué)習(xí)LSTM從input輸入到Linear輸出深入理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05Numpy中array數(shù)組對(duì)象的儲(chǔ)存方式(n,1)和(n,)的區(qū)別
本文主要介紹了Numpy中array數(shù)組對(duì)象的儲(chǔ)存方式(n,1)和(n,)的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04利用pandas將numpy數(shù)組導(dǎo)出生成excel的實(shí)例
今天小編就為大家分享一篇利用pandas將numpy數(shù)組導(dǎo)出生成excel的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06