python中讓自定義的類使用加號(hào)"+"
如果代碼是“1+1”,那么python控制臺(tái)必然輸出2,這很符合我們對(duì)“數(shù)值類”的認(rèn)識(shí),“+”運(yùn)算符必然能對(duì)數(shù)值進(jìn)行加法。
假設(shè)自己現(xiàn)在想設(shè)計(jì)一個(gè)稱為“動(dòng)漫圖片CartoonImage類”,能不能實(shí)現(xiàn)它的對(duì)象之間的“+”操作呢?比如想要對(duì)兩個(gè)動(dòng)漫圖像對(duì)象cartoon_1和cartoon_2使用“+”運(yùn)算符得到最右邊的圖像(也就是拼接功能):
如果對(duì)兩個(gè)對(duì)象直接“+”肯定是不行的,因?yàn)檫€沒有對(duì)CartoonImage類重載加法運(yùn)算符__add__(),比如下面的代碼是不行的:
# 1:創(chuàng)建對(duì)象 cartoon_1 = CartoonImage("data/left.jpg") cartoon_2 = CartoonImage("data/right.jpg") ## 2:使用“+”進(jìn)行加法 concat_image = cartoon_1 + cartoon_2
本文將從以下兩個(gè)方面來討論如何對(duì)自定義類實(shí)現(xiàn)“+”法操作:
- (1)python的魔法方法__add__()
- (2)對(duì)CartoonImage重載“+”
對(duì)于減法、乘法等,分別對(duì)應(yīng)魔法方法__sub__()、__mul__()等,和加法的道理相同,只需要按照自己想要實(shí)現(xiàn)的功能進(jìn)行重載即可。
1、python的魔法方法__add__()
python中的“+”操作對(duì)應(yīng)其背后__add__()
方法,比如自定義一個(gè)簡單的類Fun,通過實(shí)現(xiàn)Fun類的__add__()方法就能使得Fun的對(duì)象支持“+”操作:
class A: ? ? def __add__(self, x): ? ? ? ? print("adding now!") a1 = A() a2 = A()? a1 + a2
執(zhí)行上面的代碼控制臺(tái)就會(huì)顯示:“adding now!”,也就是說“a1+a2”觸發(fā)了A類的__add__()方方法。在__add__()方法內(nèi)部,我們可以實(shí)現(xiàn)任何自己希望的功能,比如實(shí)現(xiàn)兩個(gè)對(duì)象某些屬性之間加法,或者是print一些控制信息。
2、對(duì)CartoonImage重載“+”
2.1 實(shí)現(xiàn)CartoonImage類
本節(jié)通過一個(gè)小例子,來具體的展示__add__()
方法應(yīng)該如何使用,來實(shí)現(xiàn)更廣泛自定義功能。
首先是設(shè)計(jì)一個(gè)類,稱之為CartoonImage
,它包含一個(gè)屬性image,我們使用self.image來存儲(chǔ)一張卡通圖片。
CartoonImage的初始化函數(shù)如下:
class CartoonImage(): ? ? def __init__(self, image): ? ? ? ? """ 輸入如果是圖片的路徑(str類型)就去讀取圖片, ? ? ? ? 如果是圖片的數(shù)據(jù)值(ndarray類型)就直接初始化""" ? ? ? ? if isinstance(image, str): ? ? ? ? ? ? self.image = imageio.imread(image)[:, :, 0:3] ? ? ? ? elif isinstance(image, np.ndarray): ? ? ? ? ? ? self.image = image
初始化函數(shù)__init__()接收一個(gè)image
的參數(shù),這個(gè)參數(shù)可以是字符串(表示圖片的路徑),也可以是數(shù)組(表示圖片的值)。需要初始化的只有一個(gè)屬性self.image
,后面我們將對(duì)這個(gè)屬性進(jìn)行“+”。
對(duì)于__add__()魔法方法,其功能是什么完全取決于自己想要什么,而不是狹義上的加操作,比如自己想實(shí)現(xiàn)兩個(gè)圖片進(jìn)行“拼接”,這個(gè)拼接通過“+”來實(shí)現(xiàn),就可以在__add__()中做如下的實(shí)現(xiàn):
?def __add__(self, another_cartoon): ? ? ? ? """ 重載“+”,實(shí)現(xiàn)圖像拼接功能""" ? ? ? ? concat_image = np.concatenate((self.image, another_cartoon.image),axis=1) ? ? ? ? concat_cartoon = CartoonImage(concat_image) ? ? ? ? return concat_cartoon
3、測試“+”是否能實(shí)現(xiàn)圖像拼接
3.1對(duì)CartoonImage對(duì)象使用“+”操作
中已經(jīng)實(shí)現(xiàn)了__add__()方法,現(xiàn)在就能對(duì)CartoonImage
對(duì)象使用“+”操作了,
代碼如下(文章開頭處的代碼):
# 1:創(chuàng)建對(duì)象 cartoon_1 = CartoonImage("data/left.jpg") cartoon_2 = CartoonImage("data/right.jpg") # 2:使用“+”進(jìn)行加法 concat_image = cartoon_1 + cartoon_2
現(xiàn)在就能實(shí)現(xiàn)一開始的拼接效果了:
再次重點(diǎn)指出“concat_image = cartoon_1 + cartoon_2”調(diào)用的是__add__(self, another_cartoon)函數(shù)。
到此這篇關(guān)于python中讓自定義的類使用加號(hào)"+"的文章就介紹到這了,更多相關(guān)python自定義類使用加號(hào)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談keras中的后端backend及其相關(guān)函數(shù)(K.prod,K.cast)
這篇文章主要介紹了淺談keras中的后端backend及其相關(guān)函數(shù)(K.prod,K.cast),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-06-06python2.7使用plotly繪制本地散點(diǎn)圖和折線圖
這篇文章主要為大家詳細(xì)介紹了python2.7使用plotly繪制本地散點(diǎn)圖和折線圖實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04python實(shí)現(xiàn)數(shù)據(jù)庫跨服務(wù)器遷移
這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)數(shù)據(jù)庫之間的數(shù)據(jù)遷移,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04Python中多線程thread與threading的實(shí)現(xiàn)方法
這篇文章主要介紹了Python中多線程thread與threading的實(shí)現(xiàn)方法,很重要的應(yīng)用,需要的朋友可以參考下2014-08-08python數(shù)據(jù)結(jié)構(gòu)之棧、隊(duì)列及雙端隊(duì)列
在上一章的學(xué)習(xí)中,我們主要學(xué)習(xí)了怎么去衡量一個(gè)算法的好壞,比較常見的方式是使用大O記法,就是所謂的時(shí)間復(fù)雜度,這一章節(jié)我來學(xué)習(xí)基本的數(shù)據(jù)結(jié)構(gòu),如棧、隊(duì)列和雙端隊(duì)列等等。感興趣的小伙伴可以參考一下2021-12-12