Python 中的运算符重载

Python 正确重写运算符(重载) 运算符重载的作用是让用户定义的对象使用中缀运算符(如+和|)和一元运算符(如-和~)。在Python中,这些也算是运算符:函数调用:()属性访问:.元素访问和切片:[] 阅读详情

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理

一种运算符对于不同类型的对象,有不同的使用方式。例如, + 用于整型对象,表示两个数相加;用于字符串,表示连接这两个字符串。

x, y = 10, 20
print(x + y) # 30

a,b = 'John', 'Wick'
print(a + b) # John Wick
复制代码

**+**运算符因操作对象的类型的不同而执行不同的操作,这种特性称为重载。

运算符的功能因其操作数据的类型而异,我们称之为重载。

+运算符可以用于任意两个对象的相加吗?我们来试试看。

class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y

v1 = Vector(3, 4)
v2 = Vector(5, 6)
v1 + v2

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-3-08104d7e1232> in <module>
----> 1 v1 + v2

TypeError: unsupported operand type(s) for +: 'Vector' and 'Vector'
复制代码

运行这段代码会报错。为什么呢?这是因为 + 运算符不知道如何把两个 Vector 类的对象相加。

在本文中,我们将研究如何将既有的运算符用于自定义对象的操作,同时我们要牢记 Python 语言对操作符重载的一些限制性规则。

这些限制性规则有:

  1. 不允许创建新的运算符,只能重载已有的那些运算符
  2. 不允许重载已有数据类型(如 tuple 、 string 、 list)的某些运算符操作
  3. 某些运算符不能重载,例如 is, or, and, not

在开始学习运算符重载前,我们需要了解 Python 数据模型 和 特殊方法。

Python 数据模型可以看作一种 “Python 设计方式”或 “Python 框架”。它告诉你 Python 如何管理对象以及如何对它们进行操作。它描述了一系列 API,你可以使用这些 API 使你定义的对象具备已有数据类型的某些功能,并且可以使用大多数 Python 语言的特性,而且不必实现它们。

特殊方法 → 当你使用 len(collection),Python 解释器调用的是 collection.len() 方法。这里的 len() 就是一个特殊方法。

特殊方法开头和结尾都是 __ ,意为只能由 Python 解释器调用,除非你在进行元编程,不然不要直接调用它。

在 Python 语言中,我们可以使用特殊方法来实现运算符重载。

现在我们进行编码,使 Vector 对象支持 + 运算符。

当我们调用 **+** 这个运算符时,Python 解释器调用了 add(self, other) 这个特殊方法。所以,在我们定义的类中实现 add() 方法,就可以支持 + 运算符。

class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __add__(self, other):
        return Vector(self.x + other.x , self.y + other.y)

    def __repr__(self):
        return f'Vector({self.x}, {self.y})'

v1 = Vector(3, 4)
v2 = Vector(5, 6)
v1 + v2
>>> Output: Vector(8, 10)
复制代码

你会发现,我们的类已经支持 + 运算符,在这个类中还实现了 repr() 方法,当我们调用 print() 方法,解释器调用 str() 方法,如果我们没有提供 repr() 的实现,就会调用原来的 repr() 方法。

注意:除了重载类似于 += 的赋值运算符外,一定要返回一个新建的对象。

再举个重载运算符的例子

当我们使用 **==** 运算符时,Python 解释器会调用 eq(self, other) 这个特殊方法,所以我们通过实现 eq() 方法就可以使某个类支持 == 运算符。

class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __add__(self, other):
        return Vector(self.x + other.x , self.y + other.y)

    def __repr__(self):
        return f'Vector({self.x}, {self.y})'
    
    def __eq__(self, other):
        return self.x == other.x and self.y == other.y

v1 = Vector(3, 4)
v2 = Vector(5, 6)
v1 == v2
>>> Output: False

v3 = Vector(3,4)
v1 == v3
>>> Output: True
复制代码

在 Python 中,使用特殊方法可以轻松实现运算符重载。关键在于理解数据模型和特殊方法。

这些方法能让你从 Python 的惯用特性中受益,并且能利用强大的标准库。

欲了解 Python 数据模型的更多详情,请参考 Fluent python。

这里是 Python 中的特殊方法汇总,可供查阅。

总结

我们从理解什么是运算符重载开始,接着讨论了 Python 中运算符重载的一些限制条件、数据模型和特殊方法,然后在 Vector 类中实现了运算符重载。

希望你喜欢这篇文章。祝你工作顺利,好运连连!

想要获取更多Python学习资料可以加
QQ:2955637827私聊
或加Q群630390733
大家一起来学习讨论吧!

Python运算符重载,代码秒变高大上! 运算符重载是面向对象编程中的一项重要特性,它允许程序员为自定义的数据类型(如类)重新定义标准运算符的行为。这意味着,对于加号+、减号-等运算符,我们可以在不同类型的对象间赋予其特定的操作意义,而不局限于基本数据类型的操作。例如,在自定义的复数类中,我们可以重载+运算符,使其能够实现复数的加法操作。 阅读详情

相关推荐

【Python】Python中重载运算符实现类对象的加减乘除

我们有时候需要对自己的类对象使用运算符进行操作,希望能够像C++那样实现运算符重载,那么就可以重载一下Python的一些方法来实现。如果想要实现的效果是加法结束以后,加法两侧的值都不改变,则可以将。可以看到,point1的值变了,而point2的值没变。,这也就意味着,我是改变了加法前面的那个类对象的值。为例,Python中只需要在类对象中重载一下。

学习永无止境 3011

Python——运算符重载

Python——运算符重载1.加法运算符重载和减法运算符重载2.`__str__()`方法重载和`__ge__()`方法重载3.索引的切片重载 运算符重载指的是将运算符与类方法关联起来,每个运算符对应一个指定的内置方法。 Python通过重写一些内置方法,实现了运算符的重载功能。 1.加法运算符重载和减法运算符重载 加法运算符重载——__add__()方法 减法运算符重载——__sub__()方法 例 7-16 加法运算符重载和减法运算符重载的实现: #ex0716.py 加法运算符重载和减法运算符重

XQC_KKK的博客 9400

Python运算符重载方法重载

Python运算符重载 方法 重载 何时调用 __init __ 构造函数 X=Class() __del __ 析构函数 对象销毁 __repr __ 打印转换 print X,repr(X) __str __ 打印转换 print X,str(X) __call __ 调用函数 X() __getattr __ 限制 X.undefin...

寸草心的博客 2220

Python编程:正确重载运算符

Python经典进阶教程!

weixin_56051592的博客 3035

紫光同创PGL50H开发板实战:盘古50KH视频板的多媒体处理与高速通信方案

本文详细介绍了基于紫光同创PGL50H FPGA芯片的盘古50KH视频开发板在多媒体处理与高速通信方面的实战应用。文章从开发板硬件架构解析入手,逐步指导开发环境搭建、DDR3内存控制器配置、HDMI视频输入输出实战,并重点探讨了利用板载HSST高速收发器实现光纤通信与万兆以太网的方案。最后,通过构建一个集多路视频采集、处理与光纤传输于一体的系统案例,展示了该开发板在高性能实时数据处理领域的强大潜力。

b9c0d的博客 485

NVIDIA DGX Spark 开发环境深度配置与优化指南

定期系统维护每月执行一次完整的系统更新监控存储空间使用情况,及时清理临时文件定期检查硬件健康状况开发习惯优化使用tmux或screen管理长时间运行的任务配置自动化测试和代码质量检查建立完善的项目文档体系性能调优周期每月重新评估和调整系统参数根据工作负载特点优化容器配置持续监控和记录性能指标DGX Spark作为一个强大的AI开发平台,其真正的价值需要通过精细的环境配置和优化才能充分发挥。本文提供的配置方案和建议均基于实际生产环境经验,旨在帮助开发者构建稳定、高效、可维护的开发环境。

time_days的博客 3684

python中重载运算符_Python中的运算符重载

python中重载运算符Operators are used in Python to perform specific operations on the given operands. The operation that any particular operator will perform on any predefined data type is already defined in...

cunfen6312的博客 2012

IP白名单校验

支持格式: 1、127.0.0.1 // 指定固定IP 2、127.0.0.1-127.0.0.128 // 可使用“-”来表示一个IP区间,支持跨IP段(一般不会出现这种情况,跨IP段则配置多个规则) 3、127.0.* // 2~4位IP段可...

2199

python之运算符重载

    运算符重载:         什么是运算符重载             让自定义的类生成的对象(实例)能够使用运算符进行操作         作用:             让自定义的实例像内建对象一样进行运算符操作             让程序简洁易读             对自定义对象将运算符赋予新的规则         算术运算符的重载:             方法名     ...

python -学习笔记 5万+

Petalinux 2021.1 + Vivado 2021 实战:手把手教你为Zynq板卡移植Linux并搞定AXI DMA驱动

本文详细介绍了基于Petalinux 2021.1和Vivado 2021工具链,为Zynq开发板移植Linux系统并开发AXI DMA驱动的全流程。从环境配置、硬件设计到驱动适配与性能优化,提供了实战避坑技巧和版本特异性问题的解决方案,帮助开发者快速构建高速数据传输系统。

weixin_42641741的博客 386

【N32L40X】学习笔记12-规则组+注入组+外部触发启动

使用定时器触发规则通道开始采集数据,采集完成后使用dma传输数据,并启动注入通道转换数据,注入通道转换完成后产生中断,中断中读物注入通道数据。

Car12 422

运算符重载python_Python运算符重载

运算符重载pythonWelcome to the tutorial on Python Operator Overloading. As we have already learnt about Python Class, we are going to learn another interesting feature of object oriented python today. 欢迎使用...

从零开始的教程世界 2621

fast-lio系列改进版本

2.回环检测的优化结果,更新到FAST-LIO2的当前帧位姿中,幷进行ikdtree的重构,进而更新submap。其它的效果还不清楚,实测lio部分稳定性很好。用fast-lio_slam就很稳定。融合了fast-lio2和sc-pgo,两部分分开运行,SC-PGO从FAST-LIO2节点获取里程计和激光雷达点云主题。的作者kim在FAST-LIO2的基础上,添加SC-PGO模块,通过加入ScanContext全局描述子,进行回环修正,SC-PGO模块与FAST-LIO2解耦,非常方便,很优秀的工作。

z1872385的博客 3189

浅析Python运算符重载

Python语言中提供了运算符重载功能,这一点与C++有点类似,却又和C++有些许多的不同。Python的运算符重载是通过重写一些Python内置的方法实现的。这些运算符方法都是以双下划线开头和结尾的,类似于__X__的形式,python通过这种特殊的命名方式来拦截操作符,以实现重载。当Python的内置操作运用于类对象时,Python会去搜索并调用指定的方法完成运算符操作。

viclee 3万+

零基础实战:用 Docker 和 vLLM 本地部署 bge-reranker-v2-m3 重排序模型

本文介绍了如何利用Docker容器和vLLM推理框架在本地部署BAAI开发的bge-reranker-v2-m3文本排序模型。

举世誉之而不加劝,举世非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。 5971

基于lstm+gru+transformer的电池寿命预测健康状态预测-完整数据代码

基于lstm+gru+transformer的电池寿命预测健康状态预测-完整数据代码

880

python中的运算符重载_Python中的运算符重载

运算符重载意味着提供超出其预定义操作含义的扩展含义。例如,运算符+用于添加两个整数以及连接两个字符串并合并两个列表。这是可以实现的,因为int类和str类会重载’+’运算符。您可能已经注意到,相同的内置运算符或函数对不同类的对象显示不同的行为,这称为运算符重载。# Python程序,展示运算符的重载print(1 + 2)# 两个string相加print("芒果"+"For")# 两个数的乘积p...

weixin_39731916的博客 826

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

python运算符重载_Python中的运算符重载

今天的任务很简单,就是熟悉一下Python中的运算符重载。一般,我们想让自定义的类支持一些计算操作,比如会添加如下方法以期达到计算的目的:class Vector:def __init__(self, x=0, y=0):self.x = xself.y = ydef __repr__(self):return 'Vector(%r, %r)' % (self.x, self.y)def __ab...

weixin_39548733的博客 226

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Python运算符重载及其可重载运算符

每个类型都有其独特的操作方法,例如列表类型支持直接做加法操作实现添加元素的功能,字符串类型支持直接做加法实现字符串的拼接功能,也就是说,同样的运算符对于不同序列类型的意义是不一样的,这是怎么做到的呢? 其实在 Python 内部,每种序列类型都是 Python 的一个类,例如列表是 list 类,字典是 dict 类等,这些序列类的内部使用了一个叫作“重载运算符”的技术来实现不同运算符所对应的操作。 所谓重载运算符,指的是在类中定义并实现一个与运算符对应的处理方法,这样当类对象在进行运算符操作时,系统

yingxuanzhang的博客 1141

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Python 妙用运算符重载——玩出“点”花样来

本篇的主角正是“点”,今天要用运算符重载来把它玩出点花样来!哪什么是运算符重载呢?运算符重载是面向对象编程中的一个概念,它允许程序员为自定义类型(如类或结构体)定义运算符的行为。在Python等编程语言中,运算符重载是一种强大的特性,它使得我们可以用更加自然和直观的方式处理自定义类型。

汉阳Hann's Home 3292

python运算符重载

运算符重载 在Python中可通过运算符重载来实现对象之间的运算,如字符串可以进行如下运算: 字符串可以通过“+”运算符实现字符串连接操作,其本质是通过__add__方法重载了运算符“+”,因此上述代码还可以写成如下代码: Python把运算符与类的实例方法关联起来,每个运算符都对应一个方法。运算符重载就是让类的实例对象可以参与内置类型的运算。 表中列出了部分运算符重载方法。 1.算术运算符重载 定义一个复数类并对其进行算术运算符重载,如例所示。 2.比较运算符重载 定义一个复数类并对其进行比较运算

m0_52874735的博客 804

Python运算符重载

详解python运算符重载

weixin_39253570的博客 2051

python的运算符重载有什么用_Python 中的运算符重载

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理一种运算符对于不同类型的对象,有不同的使用方式。例如, + 用于整型对象,表示两个数相加;用于字符串,表示连接这两个字符串。x, y = 10, 20print(x + y) # 30a,b = 'John', 'Wick'print(a + b) # John Wick复制代码**+**运算符因操作...

weixin_39991531的博客 310

python运算符重载_Python运算符重载

运算符重载在Python语言中提供了类似于C++的运算符重在功能:一下为Python运算符重在调用的方法如下:Method Overloads Call for__init__ 构造函数 X=Class()__del__ 析构函数 对象销毁__add__ + X+Y,X+...

weixin_39638305的博客 355

python运算符重载 乘法_运算符重载python_Python运算符重载

运算符重载pythonWelcome to the tutorial on Python Operator Overloading. As we have already learnt about Python Class, we are going to learn another interesting feature of object oriented python today.欢迎使用P...

weixin_36162235的博客 577
上一篇: 5分钟完全掌握Python协程
下一篇: 只用十行 Python 代码就提取了韦小宝的身份证信息
pythonputao
博客等级 码龄6年 60粉丝 111原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值