python中讓自定義的類使用加號"+"
如果代碼是“1+1”,那麼python控制臺必然輸出2,這很符合我們對“數值類”的認識,“+”運算符必然能對數值進行加法。
假設自己現在想設計一個稱為“動漫圖片CartoonImage類”,能不能實現它的對象之間的“+”操作呢?比如想要對兩個動漫圖像對象cartoon_1和cartoon_2使用“+”運算符得到最右邊的圖像(也就是拼接功能):
如果對兩個對象直接“+”肯定是不行的,因為還沒有對CartoonImage類重載加法運算符__add__(),比如下面的代碼是不行的:
# 1:創建對象 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
執行上面的代碼控制臺就會顯示:“adding now!”,也就是說“a1+a2”觸發瞭A類的__add__()方方法。在__add__()方法內部,我們可以實現任何自己希望的功能,比如實現兩個對象某些屬性之間加法,或者是print一些控制信息。
2、對CartoonImage重載“+”
2.1 實現CartoonImage類
本節通過一個小例子,來具體的展示__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
2、測試“+”是否能實現圖像拼接
2.1對CartoonImage對象使用“+”操作
中已經實現瞭__add__()方法,現在就能對CartoonImage
對象使用“+”操作瞭,
代碼如下(文章開頭處的代碼):
# 1:創建對象 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自定義類使用加號內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 如何使用Python快速生成gif圖
- numpy中hstack vstack stack concatenate函數示例詳解
- Python數據分析之堆疊數組函數示例總結
- 基於Python實現合並多張圖片轉成mp4視頻
- 基於Python實現傻瓜式GIF制作工具