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!

推薦閱讀: