python中讓自定義的類使用加號"+"
如果代碼是“1+1”,那么python控制臺必然輸出2,這很符合我們對“數值類”的認識,“+”運算符必然能對數值進行加法。
假設自己現在想設計一個稱為“動漫圖片CartoonImage類”,能不能實現它的對象之間的“+”操作呢?比如想要對兩個動漫圖像對象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
本文將從以下兩個方面來討論如何對自定義類實現“+”法操作:
- (1)python的魔法方法__add__()
- (2)對CartoonImage重載“+”
對于減法、乘法等,分別對應魔法方法__sub__()、__mul__()等,和加法的道理相同,只需要按照自己想要實現的功能進行重載即可。
1、python的魔法方法__add__()
python中的“+”操作對應其背后__add__()
方法,比如自定義一個簡單的類Fun,通過實現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__()方法內部,我們可以實現任何自己希望的功能,比如實現兩個對象某些屬性之間加法,或者是print一些控制信息。
2、對CartoonImage重載“+”
2.1 實現CartoonImage類
本節(jié)通過一個小例子,來具體的展示__add__()
方法應該如何使用,來實現更廣泛自定義功能。
首先是設計一個類,稱之為CartoonImage
,它包含一個屬性image,我們使用self.image來存儲一張卡通圖片。
CartoonImage的初始化函數如下:
class CartoonImage(): ? ? def __init__(self, image): ? ? ? ? """ 輸入如果是圖片的路徑(str類型)就去讀取圖片, ? ? ? ? 如果是圖片的數據值(ndarray類型)就直接初始化""" ? ? ? ? if isinstance(image, str): ? ? ? ? ? ? self.image = imageio.imread(image)[:, :, 0:3] ? ? ? ? elif isinstance(image, np.ndarray): ? ? ? ? ? ? self.image = image
初始化函數__init__()接收一個image
的參數,這個參數可以是字符串(表示圖片的路徑),也可以是數組(表示圖片的值)。需要初始化的只有一個屬性self.image
,后面我們將對這個屬性進行“+”。
對于__add__()魔法方法,其功能是什么完全取決于自己想要什么,而不是狹義上的加操作,比如自己想實現兩個圖片進行“拼接”,這個拼接通過“+”來實現,就可以在__add__()中做如下的實現:
?def __add__(self, another_cartoon): ? ? ? ? """ 重載“+”,實現圖像拼接功能""" ? ? ? ? concat_image = np.concatenate((self.image, another_cartoon.image),axis=1) ? ? ? ? concat_cartoon = CartoonImage(concat_image) ? ? ? ? return concat_cartoon
3、測試“+”是否能實現圖像拼接
3.1對CartoonImage對象使用“+”操作
中已經實現了__add__()方法,現在就能對CartoonImage
對象使用“+”操作了,
代碼如下(文章開頭處的代碼):
# 1:創(chuàng)建對象 cartoon_1 = CartoonImage("data/left.jpg") cartoon_2 = CartoonImage("data/right.jpg") # 2:使用“+”進行加法 concat_image = cartoon_1 + cartoon_2
現在就能實現一開始的拼接效果了:
再次重點指出“concat_image = cartoon_1 + cartoon_2”調用的是__add__(self, another_cartoon)函數。
到此這篇關于python中讓自定義的類使用加號"+"的文章就介紹到這了,更多相關python自定義類使用加號內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
淺談keras中的后端backend及其相關函數(K.prod,K.cast)
這篇文章主要介紹了淺談keras中的后端backend及其相關函數(K.prod,K.cast),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06Python中多線程thread與threading的實現方法
這篇文章主要介紹了Python中多線程thread與threading的實現方法,很重要的應用,需要的朋友可以參考下2014-08-08