Python运算符重载,代码秒变高大上!

目录

1、运算符重载基础介绍 🧮

1.1 什么是运算符重载

1.2 为何使用运算符重载

1.3 Python中的特殊方法魔法

示例:重载加法运算符

2、实战:重载加法运算符 + 🧩

2.1 自定义类与__add__()

2.2 应用案例:复数加法

2.3 深入理解__add__方法

3、重载其他运算符示例 🔄

3.1 减法运算符 __sub__()

3.2 乘法运算符 __mul__()

3.3 丰富场景:字符串连接与列表合并

4、比较运算符重载 👍👎

4.1 __eq__, __lt__等方法

4.2 链式比较的奥秘

4.3 实战:自定义对象排序

5、赋值运算符重载 :=

5.1 理解赋值与__setattr__

5.2 高级应用:属性访问控制

6、高级技巧:运算符顺序与优先级 🎯

6.1 运算符优先级定制

6.2 复合运算符的处理

6.3 防止运算符滥用的策略

7、性能考量与陷阱 🚩

7.1 重载运算符的性能影响

7.2 常见误区与避免策略

7.3 优化建议

7、总结与展望 🚀



1、运算符重载基础介绍 🧮

1.1 什么是运算符重载

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

1.2 为何使用运算符重载

  • • 增强代码可读性:运算符重载使得代码更接近自然语言,减少冗长的函数调用,使得代码更加简洁易懂。

  • • 提升代码灵活性:通过为运算符赋予新的含义,可以轻松地扩展已有类的功能,适应更多的应用场景。

  • • 促进代码复用:标准运算符的普遍认知减少了新用户的学习成本,同时也便于在不同场景下复用已有的运算逻辑。

1.3 Python中的特殊方法魔法

Python中,运算符重载主要通过定义特殊的魔法方法(也称为dunder方法 ,即双下划线包围的方法)来实现。这些方法通常以__开始并以__结束,比如__add__用于重载加法运算符+。当对两个对象使用相应运算符时,Python会自动调用这些特殊方法来完成操作。以下是一些基本的特殊方法及其用途:

  • • __add__(self, other): 定义加法行为,如a + b

  • • __sub__(self, other): 定义减法行为,如a - b

  • • __mul__(self, other): 定义乘法行为,如a * b

  • • __truediv__(self, other): 定义真除法行为,如a / b

  • • __str__(self): 定义对象的字符串表示形式 ,用于打印或转换为字符串。

示例:重载加法运算符

假设我们要创建一个简单的向量类,重载加法运算符以便于向量之间的相加。

class Vector:
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y
    
    def __add__(self, other):
        """重载加法运算符,实现向量加法"""
        return Vector(self.x + other.x, self.y + other.y)
    
    def __str__(self):
        return f"Vector({self.x}, {self.y})"# 使用示例
v1 = Vector(1, 2)
v2 = Vector(3, 4)
result = v1 + v2
print(result)  # 输出: Vector(4, 6)

在这个例子中,我们定义了一个简单的Vector类 ,重载了__add__方法来实现向量的加法运算。当使用+运算符时,Python内部调用了__add__方法,实现了向量对象的相加,并返回了一个新的向量对象作为结果。

通过这种方式,运算符重载不仅提高了代码的可读性和表达力,还为自定义类型提供了与内置类型相似的操作体验。

2、实战:重载加法运算符 + 🧩

2.1 自定义类与__add__()

在Python中,自定义类可以通过定义特殊方法__add__来重载加法运算符+。这个方法接收另一个对象作为参数,并返回运算后的结果。让我们通过一个简单例子来理解这一过程:

class Point:
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y
    
    def __add__(self, other):
        if isinstance(other, Point):
            return Point(self.x + other.x, self.y + other.y)
        else:
            raise TypeError("Operand must be an instance of Point")# 使用示例
p1 = Point(3, 4)
p2 = Point(1, 2)
sum_point = p1 + p2
print(sum_point.x, sum_point.y)  # 输出: 4 6

这里,Point类通过实现__add__方法,使得两个点对象可以通过加法运算符相加 ,得到一个新的点,其坐标为两原点坐标的和。

2.2 应用案例:复数加法

Python的内置complex类型已经重载了加法运算符 ,但为了演示,我们可以创建一个简化版的复数类来展示这一机制:

class MyComplex:
    def __init__(self, real=0, imag=0):
        self.real = real
        self.imag = imag
    
    def __add__(self, other):
        if isinstance(other, MyComplex):
            return MyComplex(self.real + other.real, self.imag + other.imag)
        else:
            raise TypeError("Operand must be an instance of MyComplex")# 使用示例
c1 = MyComplex(3, 4)
c2 = MyComplex(1, -2)
sum_complex = c1 + c2
print(sum_complex.real, sum_complex.imag)  # 输出: 4 2

通过定义MyComplex类的__add__方法 ,我们可以像操作内置复数那样 ,使用加法运算符直接相加两个自定义复数对象。

2.3 深入理解__add__方法

__add__方法是Python中用于定义加法行为的核心特殊方法。当对两个对象使用加号+时 ,Python会检查右侧对象是否有__radd__方法,如果没有,则调用左侧对象的__add__方法。这保证了即使在操作符两边的对象类型不同时,也能尝试找到合适的方法来完成操作。值得注意的是,正确实现isinstance检查对于确保运算符的兼容性和避免类型错误至关重要。此外,实现__add__时 ,还应考虑运算的逆操作,即可能需要定义__radd__方法来处理非对称操作情况。

3、重载其他运算符示例 🔄

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/30735.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cytoscape之操作界面介绍

Cytoscape 简介 Cytoscape是一个专注于开源网络可视化和分析的软件。软件的核心部分提供了网络显示、布局、查询等方面的基本功能。软件的核心可以通过插件架构进行扩展,这样就能快速地开发出新的功能。 Cytoscape 源自系统生物学,用于将生物分子交互网…

Linux和Windows(VS 2019)下安装使用Log4cpp日志库

目录 一、Log4cpp简介 二、Windows下的Log4cpp的安装 1、下载网址 2、解决方案 三、Vistual Studio中使用第三方库 1、拷贝对应下图路径下的include文件进入你的项目目录下面去,并将之前编译好的库文件也放在对应项目目录下面去。 2、打开你的项目&#xff0…

nacos 配置修改.代码实时刷新

再类上用 RefreshScope 更新Value(“${uniqlo.privacy.url:https://wsurl.cc/yourls-api.php}”) private String shortLinkGenerateUrl;的数据可以实时更新 2.再配置类上次用 ConfigurationProperties(prefix “test.privacy”) 和nacos的配置一直 Data Component Configu…

华为云EI生态

1、人工智能技术趋势 2、华为AI发展思路 3、华为云EI:让企业更智能 4、华为云服务全景图 5、基础平台类服务 6、MLS:解决特性到模型应用的完整过程 7.DLS 8.GES超大规模一体化图分析与查询 9、EI视觉认知 10、EI语音语义 11、OCR:提供高精度光学文字自动…

C++初学者指南第一步---9.函数

C初学者指南第一步—9.函数 文章目录 C初学者指南第一步---9.函数1.输入和输出1.1第一个例子1.2返回类型1.3函数参数常量参数默认值参数 1.4函数重载 2.函数执行2.1递归2.2 声明和定义 3.函数设计3.1约定3.2 特性[[nodiscard]] (C17)3.3 不抛出异常保证&…

【Python驯化-01】python中set去重数据每次结果不一致问题解决

【Python驯化-01】python中set去重数据每次结果不一致问题解决 本次修炼方法请往下查看 🌈 欢迎莅临我的个人主页 👈这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合,智慧小天地! 🎇 免费获取相关内容文档关注…

考研计组chap2数据的表示和运算

3一、进位计数制 1.r进制 第i位表示r进制的权为i 2.进制转换 (1)r->10 对应位置数*权值 (2)2 -> 16 or 8 每三位2进制数可表示1位16进制 每四位2进制数可表示1位16进制 so 分开之后转为16进制即可 eg:1…

基于51单片机恒温箱设计

基于51单片机恒温箱设计 (程序+原理图+设计报告) 功能介绍 具体功能: 本设计由STC89C52单片机电路数字温度传感器DS18B20电路按键电路蜂鸣器报警电路继电器控制电路LCD1602液晶显示电路电源电路组成。 1.LCD1602液…

偏微分方程算法之抛物型方程差分格式编程示例四(Richardson外推)

目录 一、研究问题 二、C++代码 三、结果分析 一、研究问题 已知其精确解为。分别取以下三种步长: ①

树形dp,CF 1926 G - Vlad and Trouble at MIT

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 Problem - G - Codeforces 二、解题报告 1、思路分析 考虑每个结点最终状态只可能为和P连通或者和S连通 我们我们自然而然的将问题划分为这样的状态 f[x][0]代表结点x和P连通需要割掉最少的边 f[x][1]代…

Windows Server配置NFS,做ESXI共享存储

1:登录wINDOWS系统,点击添加角色和功能。 2:根据向导提示,一路下一步。在服务器角色中选择文件和存储服务器在文件和iSCSI服务中勾选NFS服务器。 3:按照提示一路下一步,安装NFS。 4:安装完成后关闭安装界面。 5&#x…

代码随想录算法训练营第六十五天 | 岛屿数量 深搜、岛屿数量 广搜、岛屿的最大面积

岛屿数量 深搜 题目链接:99. 岛屿数量 文字讲解:99. 岛屿数量 | 代码随想录 解题思路 本题已经说明,只有水平方向和竖直方向才能组成岛屿 本题思路,是遇到一个没有遍历过的节点陆地,计数器就加一,然后把…

为电脑小白推荐的5款实用工具软件

​ 电脑上的各类软件有很多,除了那些常见的大众化软件,还有很多不为人知的小众软件,专注于实用功能,简洁干净、功能强悍。 1.磁盘空间分析——TreeSize Free ​ TreeSize Free是一款免费的磁盘空间分析工具,能够扫描…

Sip协议(四) -注册流程

Sip协议(四) -注册流程 本文主要介绍下sip协议中, agent的注册流程. 一: 流程图 简单的流程图如下: agent发起注册fs 返回401 ,并携带WWW-Authenticateagent第二次发起注册,增加Authorizationfs返回授权成功, 或者失败. 二: sip流程 发起注册REGISTER 首先agent发起注册请求…

重磅!鹅厂大牛带你30分钟玩转AI智能结对编程!

在大模型时代,人工智能技术的突破性进展正重塑着软件开发的面貌。AI的融入不仅优化了代码编写过程,更开启了智能编程的新纪元,为开发者带来了前所未有的工作效率和创新可能。AI结对编程不仅能够极大提升研发效率,还能通过智能分析…

【查缺补漏】python

python查缺补漏 底板除 还有一种除法是//,称为地板除,两个整数的除法仍然是整数: >>> 10 // 3 3你没有看错,整数的地板除//永远是整数,即使除不尽。要做精确的除法,使用/就可以。 因为//除法只…

rsa加签验签C#和js、java、微信小程序互通

js实现rsa加签验签 https://github.com/kjur/jsrsasign 11.1.0版本 解压选择需要的版本&#xff0c;这里选择all版本了 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>JS RSA加签验签</title&g…

有趣网站分享 - 生成 O‘Reilly 类型封面

文章目录 网站介绍效果 网站介绍 –> O’RLY 封面工厂 https://orly.nanmu.me 你可以… 设置文本内容 选择图片 选择颜色 效果 2024-06-20&#xff08;四&#xff09;

前端网页开发学习(HTML+CSS+JS)有这一篇就够!

目录 HTML教程 ▐ 概述 ▐ 基础语法 ▐ 文本标签 ▐ 列表标签 ▐ 表格标签 ▐ 表单标签 CSS教程 ▐ 概述 ▐ 基础语法 ▐ 选择器 ▐ 修饰文本 ▐ 修饰背景 ▐ 透明度 ▐ 伪类 ▐ 盒子模型 ▐ 浮动 ▐ 定位 JavaScript教程 ▐ 概述 ▐ 基础语法 ▐ 函数 …

契约锁电子签章平台 add 远程命令执行漏洞复现(XVE-2023-23720)

0x01 产品简介 契约锁电子签章平台是上海亘岩网络科技有限公司推出的一套数字签章解决方案。契约锁为中大型组织提供“数字身份、电子签章、印章管控以及数据存证服务”于一体的数字可信基础解决方案,可无缝集成各类系统,让其具有电子化签署的能力,实现组织全程数字化办公。通…