脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Python - python中让自定义的类使用加号"+"

python中让自定义的类使用加号"+"

2022-10-29 12:16机器学习入坑者 Python

这篇文章主要介绍了python中让自定义的类使用加号"+",如果对两个对象直接“+”肯定是不行的,因为还没有对CartoonImage类重载加法运算符__add__(),下文小编举例形式讲解该内容,需要的下伙伴可以参考一下

如果代码是“1+1”,那么python控制台必然输出2,这很符合我们对“数值类”的认识,“+”运算符必然能对数值进行加法。

假设自己现在想设计一个称为“动漫图片CartoonImage类”,能不能实现它的对象之间的“+”操作呢?比如想要对两个动漫图像对象cartoon_1和cartoon_2使用“+”运算符得到最右边的图像(也就是拼接功能):

python中让自定义的类使用加号"+"

如果对两个对象直接“+”肯定是不行的,因为还没有对CartoonImage类重载加法运算符__add__(),比如下面的代码是不行的:

?
1
2
3
4
5
# 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的对象支持“+”操作:

?
1
2
3
4
5
6
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的初始化函数如下:

?
1
2
3
4
5
6
7
8
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__()中做如下的实现:

?
1
2
3
4
5
 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
2
3
4
5
# 1:创建对象
cartoon_1 = CartoonImage("data/left.jpg")
cartoon_2 = CartoonImage("data/right.jpg")
# 2:使用“+”进行加法
concat_image = cartoon_1 + cartoon_2

现在就能实现一开始的拼接效果了:

python中让自定义的类使用加号"+"

再次重点指出“concat_image = cartoon_1 + cartoon_2”调用的是__add__(self, another_cartoon)函数。

到此这篇关于python中让自定义的类使用加号"+"的文章就介绍到这了,更多相关python自定义类使用加号内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://zhuanlan.zhihu.com/p/89892053

延伸 · 阅读

精彩推荐
  • Python使用Python来开发微信功能

    使用Python来开发微信功能

    这篇文章主要介绍了使用Python来开发微信功能,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下...

    寒食君11442021-03-04
  • Pythonpython实现dbscan算法

    python实现dbscan算法

    DBSCAN 算法是一种基于密度的空间聚类算法,本文主要介绍了python实现dbscan算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    克金森沐沐9302021-11-09
  • Python利用python修改json文件的value方法

    利用python修改json文件的value方法

    今天小编就为大家分享一篇利用python修改json文件的value方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    cabinx16802021-05-10
  • PythonPytorch 使用tensor特定条件判断索引

    Pytorch 使用tensor特定条件判断索引

    这篇文章主要介绍了Pytorch 使用tensor特定条件判断索引的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    judgechen199712482021-10-07
  • PythonJupyter notebook运行后打不开网页的问题解决

    Jupyter notebook运行后打不开网页的问题解决

    本文主要介绍了Jupyter notebook运行后打不开网页的问题解决,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    陈承宇- 。-7252022-10-20
  • Pythonpython对象及面向对象技术详解

    python对象及面向对象技术详解

    这篇文章主要介绍了python对象及面向对象技术,结合实例形式详细分析了Python面向对象所涉及的类、对象、方法、属性等概念与使用技巧,需要的朋友可以参...

    miky5042020-09-02
  • PythonPython机器学习算法之决策树算法的实现与优缺点

    Python机器学习算法之决策树算法的实现与优缺点

    决策树(Decision Tree)是一种基本的分类与回归方法,这篇文章主要给大家介绍了关于Python机器学习算法之决策树算法实现与优缺点的相关资料,需要的朋友...

    ProChick12322021-11-01
  • PythonPython自动化之数据驱动让你的脚本简洁10倍【推荐】

    Python自动化之数据驱动让你的脚本简洁10倍【推荐】

    数据驱动是一种思想,让数据和代码进行分离。这篇文章主要介绍了Python自动化之数据驱动,让你的脚本简洁10倍,需要的朋友可以参考下...

    51CTO6952021-07-02