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

目录
  • 1、python的魔法方法__add__()
  • 2、对CartoonImage重载“+”
    • 2.1实现CartoonImage类
  • 3、测试“+”是否能实现图像拼接
    • 3.1对CartoonImage对象使用“+”操作

如果代码是“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

3、测试“+”是否能实现图像拼接

3.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自定义类使用加号内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python自定义类并使用的方法

    本文实例讲述了python自定义类并使用的方法.分享给大家供大家参考.具体如下: class Person: def __init__(self, first, middle, last, age): self.first = first; self.middle = middle; self.last = last; self.age = age; def __str__(self): return self.first + ' ' + self.middle + ' ' + self.las

  • python自定义时钟类、定时任务类

    这是我使用python写的第一个类(也算是学习面向对象语言以来正式写的第一个解耦的类),记录下改进的过程. 分析需求 最初,因为使用time模块显示日期时,每次都要设置时间字符串的格式,挺麻烦,但还是忍了. 后来,在处理多线程任务时需要实现定时控制的功能,更麻烦,终于决定自己做一个解决这些问题的通用代码(虽然网上有现成的模块,但亲手编写这部分代码正好能锻炼一下我的面向对象编程). 分析框架 刚开始,我计划做一个模仿时钟的抽象类,让它独立运行在一个线程中,让它提供显示日期.计时.设置定时任务的方法

  • Python自定义指标聚类实例代码

    目录 前言 与KMeans++比较 Yolo检测框聚类 总结 前言 最近在研究 Yolov2 论文的时候,发现作者在做先验框聚类使用的指标并非欧式距离,而是IOU.在找了很多资料之后,基本确定 Python 没有自定义指标聚类的函数,所以打算自己做一个 设训练集的 shape 是 [n_sample, n_feature],基本思路是: 簇中心初始化:第 1 个簇中心取样本的特征均值,shape = [n_feature, ]:从第 2 个簇中心开始,用距离函数 (自定义) 计算每个样本到最近中

  • Python自定义一个异常类的方法

    如何实现自定义一个异常 python内置了许多异常类,为编写代码划定红线,才使调试代码时能及时发现错误.那么我们编写一个模块也可以为使用此模块者划定红线,来约束使用者可用哪些数据,这就需要自定义异常类型. 首先需要了的是自定义类是的父类: python说明文档中是这样说 exception Exception: 所有内置的非系统退出类异常都派生自此类. 所有用户自定义异常也应当派生自此类. 那么就可以通过直接或间接的继承Exception就可以自定义一个异常类,当然也可以间接的继承python内

  • python迭代器自定义类的具体方法

    1.说明 迭代器还具有迭代用户定制类别的能力.迭代对象需要支持两种方式:_iter__()和next(),前者返回迭代本身,后者返回下一个元素. 2.实例 class example(object): def __init__(self,num): self.num=num def __iter__(self): return self def __next__(self): if self.num <= 0: raise StopIteration tmp = self.num self.nu

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

    目录 1.python的魔法方法__add__() 2.对CartoonImage重载“+” 2.1实现CartoonImage类 3.测试“+”是否能实现图像拼接 3.1对CartoonImage对象使用“+”操作 如果代码是“1+1”,那么python控制台必然输出2,这很符合我们对“数值类”的认识,“+”运算符必然能对数值进行加法. 假设自己现在想设计一个称为“动漫图片CartoonImage类”,能不能实现它的对象之间的“+”操作呢?比如想要对两个动漫图像对象cartoon_1和cart

  • 浅谈python中的面向对象和类的基本语法

    当我发现要写python的面向对象的时候,我是踌躇满面,坐立不安呀.我一直在想:这个坑应该怎么爬?因为python中关于面向对象的内容很多,如果要讲透,最好是用面向对象的思想重新学一遍前面的内容.这个坑是如此之大,犹豫再三,还是只捡一下重要的内容来讲吧,不足的内容只能靠大家自己去补充了. 惯例声明一下,我使用的版本是 python2.7,版本之间可能存在差异. 好,在开讲之前,我们先思考一个问题,看代码: 为什么我只创建是为 a 赋值,就可以使用一些我没写过的方法? 可能会有小伙伴说:因为 a

  • thinkphp5.1 中使用自定义异常处理类进行接管

    配置文件修改 config/app.php 自定义异常接管类出处 'exception_handle' => '\app\common\exception\ExceptionHandle', 自定义处理异常方法 寡人的存放目录为 app/common/exception ApiException.php namespace app\common\exception; use Exception; class ApiException extends Exception { /** * 构造函数

  • 详解Python中的自定义密码验证

    目录 在测试:nut_and_bolt:️之前 试验contains_character TestContainsCharacter字符 试验is_valid_size TestIsValidSize 试验is_valid_password TestIsValidPassword 重构is_valid_password 结论 这些帖子将分为三个部分. 1.密码验证功能 2.重构密码验证函数 3.对密码验证功能进行单元测试 这是Python系列中自定义密码验证的第三部分,也是最后一部分.我们将看看

  • Python中如何自定义函数

    目录 Python自定义函数 自定义函数的语法 自定义函数的实现 自定义函数的调用 Python自定义函数基础概念 函数定义语法 函数文档字符串 函数定义规则 形参定义方式 函数调用 函数调用时参数的传递形式 全局变量与局部变量 函数的功能性 函数式编程 函数的 可重入性(结果唯一性) 总结 Python自定义函数 在Python编程中,可以使用已经定义好的函数,也可以自定义函数实现某些特殊的功能. 自定义函数的语法 在Python中,自定义函数的语法如下所示 def 函数名(参数):   函数

  • 详解Python中的静态方法与类成员方法

    前言 因为Python的水平目前一直是处于能用阶段,平时写的脚本使用的Python的写法也比较的简单,没有写过稍微大一点的项目.对Python中的类,类之间的组织关系,整个项目中类之间如何耦合还缺乏认识.打算读一读别人写的Python代码来学习一下Python在工程中的应用,提升自己的技术水平.选取的Python代码是Python爬虫代码,github地址.这个代码刚好是符合跳出我的舒适区的水平的代码,因此很适合我目前的水平来学习. 在Python2.4之后,主要使用装饰器来实现静态方法和类方法

  • python中的type,元类,类,对象用法

    目录 type,元类,类,对象 简单描述 类的生成方式 元类 元类type学习总结 type的作用是干什么呢? type,元类,类,对象 简单描述 1.type是python内建元类,新建的元类需要继承type 2.元类用来创建类,类用来创建对象 类的生成方式 传统定义通过声明关键字class #1.创建Person类 #2.继承object #3.拥有属性eat class Person(object):     def eat(self,food="rice"):        

  • Python中的自定义函数学习笔记

    定义一个什么都不做的函数 复制代码 代码如下: >>> def a(): ... pass ... >>> def printHello(): ... print("hello") ... >>> printHello() hello >>> callable(printHello) True 顾名思义,callable函数用于判断函数是否可以调用: 有书上说,callable在Python3.0中已经不再使用,而

  • Python中自定义函方法与参数具有默认值的函数

    目录 一.Python中自定义函数的方法 1自定义函数的语法 2自定义函数的实现 3自定义函数的调用 二.Python中参数具有默认值的函数 1参数是常量默认值的函数 2参数是常量默认值的函数 一.Python中自定义函数的方法 在Python编程中,可以使用已经定义好的函数,也可以自定义函数实现某些特殊的功能. 1 自定义函数的语法 在Python中,自定义函数的语法如下所示: def 函数名(参数):     函数体 其中,def是关键字:之后跟的是函数名,通过函数名来调用该函数:函数名之后

  • 详细解读Python中的__init__()方法

    __init__()方法意义重大的原因有两个.第一个原因是在对象生命周期中初始化是最重要的一步:每个对象必须正确初始化后才能正常工作.第二个原因是__init__()参数值可以有多种形式. 因为有很多种方式为__init__()提供参数值,对于对象创建有大量的用例,我们可以看看其中的几个.我们想尽可能的弄清楚,因此我们需要定义一个初始化来正确的描述问题区域. 在我们接触__init__()方法之前,无论如何,我们都需要粗略.简单地看看在Python中隐含的object类的层次结构. 在这一章,我

随机推荐