python中讓自定義的類使用加號"+"
如果代碼是“1+1”,那么python控制臺必然輸出2,這很符合我們對“數(shù)值類”的認識,“+”運算符必然能對數(shù)值進行加法。
假設自己現(xiàn)在想設計一個稱為“動漫圖片CartoonImage類”,能不能實現(xiàn)它的對象之間的“+”操作呢?比如想要對兩個動漫圖像對象cartoon_1和cartoon_2使用“+”運算符得到最右邊的圖像(也就是拼接功能):

如果對兩個對象直接“+”肯定是不行的,因為還沒有對CartoonImage類重載加法運算符__add__(),比如下面的代碼是不行的:
# 1:創(chuàng)建對象
cartoon_1 = CartoonImage("data/left.jpg")
cartoon_2 = CartoonImage("data/right.jpg")
## 2:使用“+”進行加法
concat_image = cartoon_1 + cartoon_2本文將從以下兩個方面來討論如何對自定義類實現(xiàn)“+”法操作:
- (1)python的魔法方法__add__()
- (2)對CartoonImage重載“+”
對于減法、乘法等,分別對應魔法方法__sub__()、__mul__()等,和加法的道理相同,只需要按照自己想要實現(xiàn)的功能進行重載即可。
1、python的魔法方法__add__()
python中的“+”操作對應其背后__add__()方法,比如自定義一個簡單的類Fun,通過實現(xiàn)Fun類的__add__()方法就能使得Fun的對象支持“+”操作:
class A:
? ? def __add__(self, x):
? ? ? ? print("adding now!")
a1 = A()
a2 = A()?
a1 + a2執(zhí)行上面的代碼控制臺就會顯示:“adding now!”,也就是說“a1+a2”觸發(fā)了A類的__add__()方方法。在__add__()方法內(nèi)部,我們可以實現(xiàn)任何自己希望的功能,比如實現(xiàn)兩個對象某些屬性之間加法,或者是print一些控制信息。
2、對CartoonImage重載“+”
2.1 實現(xiàn)CartoonImage類
本節(jié)通過一個小例子,來具體的展示__add__()方法應該如何使用,來實現(xiàn)更廣泛自定義功能。
首先是設計一個類,稱之為CartoonImage,它包含一個屬性image,我們使用self.image來存儲一張卡通圖片。
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__()接收一個image的參數(shù),這個參數(shù)可以是字符串(表示圖片的路徑),也可以是數(shù)組(表示圖片的值)。需要初始化的只有一個屬性self.image,后面我們將對這個屬性進行“+”。
對于__add__()魔法方法,其功能是什么完全取決于自己想要什么,而不是狹義上的加操作,比如自己想實現(xiàn)兩個圖片進行“拼接”,這個拼接通過“+”來實現(xiàn),就可以在__add__()中做如下的實現(xiàn):
?def __add__(self, another_cartoon): ? ? ? ? """ 重載“+”,實現(xiàn)圖像拼接功能""" ? ? ? ? concat_image = np.concatenate((self.image, another_cartoon.image),axis=1) ? ? ? ? concat_cartoon = CartoonImage(concat_image) ? ? ? ? return concat_cartoon
3、測試“+”是否能實現(xiàn)圖像拼接
3.1對CartoonImage對象使用“+”操作
中已經(jīng)實現(xiàn)了__add__()方法,現(xiàn)在就能對CartoonImage對象使用“+”操作了,
代碼如下(文章開頭處的代碼):
# 1:創(chuàng)建對象
cartoon_1 = CartoonImage("data/left.jpg")
cartoon_2 = CartoonImage("data/right.jpg")
# 2:使用“+”進行加法
concat_image = cartoon_1 + cartoon_2現(xiàn)在就能實現(xiàn)一開始的拼接效果了:

再次重點指出“concat_image = cartoon_1 + cartoon_2”調(diào)用的是__add__(self, another_cartoon)函數(shù)。
到此這篇關于python中讓自定義的類使用加號"+"的文章就介紹到這了,更多相關python自定義類使用加號內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
PyCharm調(diào)用matplotlib繪圖時圖像彈出問題詳解
這篇文章主要給大家介紹了關于PyCharm調(diào)用matplotlib繪圖時圖像彈出問題的相關資料,文中通過圖文介紹的非常詳細,對大家學習或者使用PyCharm具有一定的參考學習價值,需要的朋友可以參考下2022-07-07
python類型強制轉(zhuǎn)換long to int的代碼
python的int型最大值和系統(tǒng)有關,32位和64位系統(tǒng)結(jié)果是不同的,分別為2的31次方減1和2的63次方減1,可以通過sys.maxint查看此值2013-02-02
Python使用arrow庫優(yōu)雅地處理時間數(shù)據(jù)詳解
雖然Python提供了多個內(nèi)置模塊用于操作日期時間,但有的時候并不能滿足我們的需求,所以下面這篇文章主要給大家介紹了關于Python使用arrow庫如何優(yōu)雅地處理時間數(shù)據(jù)的相關資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-10-10
Python數(shù)學建模PuLP庫線性規(guī)劃進階基于字典詳解
在大規(guī)模的規(guī)劃問題中,這樣逐個定義變量和設置模型參數(shù)非常繁瑣,效率很低。Pulp 庫提供了一種快捷方式,可以結(jié)合 Python語言的循環(huán)和容器,使用字典來創(chuàng)建問題2021-10-10

