当前位置: 首页 > news >正文

python运算符重载之字符串显示和右侧加法

1 python运算符重载之字符串显示和右侧加法

1.1 重载字符串显示

1.1.1 str和repr

python调用prin()t时,自动调用__str__和__repr__,

python调用str()时,自动调用__str__和__repr__,

python调用repr()时,自动调用__repr__,不调用 str

终端用__str__,开发时用__repr__。

自定义__str__和__repr__时,必须返回字符串。

>>> class MyAdd:def __init__(self,value=0):self.data=valuedef __add__(self,other):self.data+=other
>>> class MyAddRepr(MyAdd):def __repr__(self):return 'MyAddRepr({})'.format(self.data)
>>> ma=MyAdd(1)
>>> print(ma)
<__main__.MyAdd object at 0x03869C90> 
>>> mar=MyAddRepr(1)
# print 自动调用 __repr__
>>> print(mar)
MyAddRepr(1)
# str repr 自动调用 __repr__
>>> str(mar),repr(mar)
('MyAddRepr(1)', 'MyAddRepr(1)')>>> class MyAddStr(MyAdd):def __str__(self):return 'MyAddStr({})'.format(self.data)
>>> mas=MyAddStr(2)
# print 自动调用 __str__
>>> print(mas)
MyAddStr(2)
# str 自动调用 __str__
# repr 不会调用 __str__
>>> str(mas),repr(mas)
('MyAddStr(2)', '<__main__.MyAddStr object at 0x03869CD0>')>>> class MyAddBoth(MyAdd):def __str__(self):return 'MyAddBothstr({})'.format(self.data)def __repr__(self):return 'MyAddBothrepr({})'.format(self.data)>>> mab=MyAddBoth(3)
# print str 自动调用 __str__
# repr 自动调用 __repr__
>>> print(mab)
MyAddBothstr(3)
>>> str(mab),repr(mab)
('MyAddBothstr(3)', 'MyAddBothrepr(3)')

1.1.2 自定义repr

当print对象在顶层时会调用自定义__str__,非顶层时调用默认调用内容或调用__repr__。

所以,建议自定义__repr__,来统一拦截print(),str(),repr()操作。

>>> class MyPrintStr:def __init__(self,val):self.val=valdef __str__(self):return str(self.val)
>>> class MyPrintRepr:def __init__(self,val):self.val=valdef __repr__(self):return str(self.val)
# 实例非顶层时print时用默认打印,或者repr,而不会用str
>>> mpsl=[MyPrintStr(1),MyPrintStr(2)]
>>> mprl=[MyPrintRepr(1),MyPrintRepr(2)]
>>> print(mpsl)
[<__main__.MyPrintStr object at 0x009F8370>, <__main__.MyPrintStr object at 0x009F8430>]
>>> print(mprl)
[1, 2]

1.2 重载右侧和原处加法

1.2.1 radd

实例在加号左侧,自动调用 add

实例在加号右侧,自动调用 radd

>>> class MyRadd:def __init__(self,val):self.val = valdef __add__(self,other):print('add',self.val,other)return self.val+otherdef __radd__(self,other):print('radd',self.val,other)return other+self.val
>>> x=MyRadd(8)
>>> y=MyRadd(9)
# 实例 在加号左边, 自动调用 __add__
>>> x+1
add 8 1
9
# 实例 在加号右边, 自动调用 __radd__
>>> 1+y
radd 9 1
10
# 两个实例相加时, 先调用 add 再调用 radd
>>> x+y
add 8 <__main__.MyRadd object at 0x00A23A30>
radd 9 8
17# return 类实例时,需要类型测试isinstance,避免嵌套循环
>>> class MyRaddIf:def __init__(self,val):self.val = valdef __add__(self,other):print('add',self.val,other)if isinstance(other,MyRaddIf):other=other.valreturn MyRaddIf(self.val+other)def __radd__(self,other):print('radd',self.val,other)return MyRaddIf(other+self.val)def __repr__(self):return '<MyRaddIf:{}>'.format(self.val)>>> x=MyRaddIf(8)
>>> y=MyRaddIf(9)
>>> print(x+10)
add 8 10
<MyRaddIf:18>
>>> print(10+y)
radd 9 10
<MyRaddIf:19>
>>> z=x+y
add 8 <MyRaddIf:9>
>>> print(z)
<MyRaddIf:17>
#>>> print(z)#注释 if isinstance(other,MyRaddIf) 时,发生嵌套
#<MyRaddIf:<MyRaddIf:17>>
>>> print(z+10)
add 17 10
<MyRaddIf:27>
>>> print(z+z)
add 17 <MyRaddIf:17>
<MyRaddIf:34>
>>> class MyRadd:def __init__(self,val):self.val = valdef __add__(self,other):print('add',self.val,other)return self.val+other
>>> x=MyRadd(8)
>>> x+1
add 8 1
9
# 没有radd时,实例在右侧会报错
>>> 1+x
Traceback (most recent call last):File "<pyshell#127>", line 1, in <module>1+x
TypeError: unsupported operand type(s) for +: 'int' and 'MyRadd'

1.2.2 iadd

python的+=优先调用__iadd___,没有再调用_add__。

>>> class MyIadd:def __init__(self,val):self.val=valdef __iadd__(self,other):self.val+=otherreturn self
# += 调用 __add__
>>> x=MyIadd(5)
>>> x+=1
>>> x.val
6
>>> class MyIadd:def __init__(self,val):self.val=valdef __add__(self,other):self.val+=otherreturn self
# += 调用 __add__
>>> x=MyIadd(5)
>>> x+=1
>>> x.val
6
>>> class MyIadd:def __init__(self,val):self.val=valdef __add__(self,other):print('__add__')self.val+=otherreturn selfdef __iadd__(self,other):print('__iadd__')self.val+=otherreturn self
# += 优先调用 __iadd__
>>> x=MyIadd(5)
>>> x+=1
__iadd__

相关文章:

python运算符重载之字符串显示和右侧加法

1 python运算符重载之字符串显示和右侧加法 1.1 重载字符串显示 1.1.1 str和repr python调用prin()t时&#xff0c;自动调用__str__和__repr__&#xff0c; python调用str()时&#xff0c;自动调用__str__和__repr__&#xff0c; python调用repr()时&#xff0c;自动调用_…...

卷积神经网络(AlexNet)鸟类识别

文章目录 一、前言二、前期工作1. 设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09;2. 导入数据3. 查看数据 二、数据预处理1. 加载数据2. 可视化数据3. 再次检查数据4. 配置数据集 三、AlexNet (8层&#xff09;介绍四、构建AlexNet (8层&#xff09;网络模型五、…...

hive 报错return code 40000 from org.apache.hadoop.hive.ql.exec.MoveTask解决思路

参考学习 https://github.com/apache/hive/blob/2b57dd27ad61e552f93817ac69313066af6562d9/ql/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java#L47 为啥学习error code 开发过程中遇到以下错误&#xff0c;大家觉得应该怎么办&#xff1f;从哪方面入手呢&#xff1f; 1.百…...

Java Web——XML

1. XML概述 XML是EXtensible Markup Language的缩写&#xff0c;翻译过来就是可扩展标记语言。XML是一种用于存储和传输数据的语言&#xff0c;它使用标签来标记数据&#xff0c;以便于计算机处理和我们人来阅读。 “可扩展”三个字表明XML可以根据需要进行扩展和定制。这意味…...

【.NET Core】Task应用详解

【.NET Core】Task应用详解 文章目录 【.NET Core】Task应用详解一、概述二、Task用法应用2.1 通过New实例化Task2.2 通过Factory中StartNew方法2.3 通过Run方法 三、让Task任务按顺序执行四、通过异步Run方法异步执行顺序Task五、创建带有返回值的Task<TResult>六、Task…...

convertRect:toView 方法注意事项

这是在网上找到的一张图 我们开发中有时候会用到左边转换&#xff0c;convertRect:toView 通常情况下&#xff0c;我们回这样使用 CGRect newRect [a convertRect:originframe toView:c];其中newRect和 originframe的size相同&#xff0c;只改变origin newRect.origin a…...

Java实现王者荣耀小游戏

主要功能 键盘W,A,S,D键&#xff1a;控制玩家上下左右移动。按钮一&#xff1a;控制英雄发射一个矩形攻击红方小兵。按钮控制英雄发射魅惑技能&#xff0c;伤害小兵并让小兵停止移动。技能三&#xff1a;攻击多个敌人并让小兵停止移动。普攻&#xff1a;对小兵造成基础伤害。小…...

【黑马甄选离线数仓day04_维度域开发】

1. 维度主题表数据导出 1.1 PostgreSQL介绍 PostgreSQL 是一个功能强大的开源对象关系数据库系统&#xff0c;它使用和扩展了 SQL 语言&#xff0c;并结合了许多安全存储和扩展最复杂数据工作负载的功能。 官方网址&#xff1a;PostgreSQL: The worlds most advanced open s…...

C# 中using关键字的使用

在C#中我们还是很有必要掌握using关键字的。 比如这样&#xff1a; string path “D:\data.txt”; if (!File.Exists(path )) {File.Create(path); File.WriteAllText(path,"OK"); } 首先我创建…...

16 redis高可用读写分离方案

在前面说的JedisSentinelPool只能实现主从的切换&#xff0c;而无法实现读写的分离。 1.哨兵的客户端实现主从切换方案 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</arti…...

Nginx模块开发之http handler实现流量统计(2)

文章目录 一、概述二、Nginx handler模块开发2.1、代码实现2.2、编写config文件2.3、编译模块到Nginx源码中2.4、修改conf文件2.5、执行效果 总结 一、概述 上一篇【Nginx模块开发之http handler实现流量统计&#xff08;1&#xff09;】使用数组在单进程实现了IP的流量统计&a…...

案例012:Java+SSM+uniapp基于微信小程序的科创微应用平台设计与实现

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…...

vue3+elementPlus登录向后端服务器发起数据请求Ajax

后端的url登录接口 先修改main.js文件 // 导入Ajax 前后端数据传输 import axios from "axios"; const app createApp(App) //vue3.0使用app.config.globalProperties.$http app.config.globalProperties.$http axios app.mount(#app); login.vue 页面显示部分…...

存储区域

将应用程序加载到内存空间执行时&#xff0c;操作系统负责代码段、数据段和BSS段的加载&#xff0c;并在内存中为这些段分配空间。 栈段亦由操作系统分配和管理&#xff0c;而不需要程序员显示地管理&#xff1b;堆段由程序员自己管理&#xff0c;即显示地申请和释放空间。 进…...

C#串口通信从入门到精通(27)——高速通信下解决数据处理慢的问题(20ms以内)

前言 我们在开发串口通信程序时,有时候会遇到比如单片机或者传感器发送的数据速度特别快,比如10ms、20ms发送一次,并且每次发送的数据量还比较大,如果按照常规的写法,我们会发现接收的数据还没处理完,新的数据又发送过来了,这就会导致处理数据滞后,软件始终处理的不是…...

Redis-Redis高可用集群之水平扩展

Redis3.0以后的版本虽然有了集群功能&#xff0c;提供了比之前版本的哨兵模式更高的性能与可用性&#xff0c;但是集群的水平扩展却比较麻烦&#xff0c;今天就来带大家看看redis高可用集群如何做水平扩展&#xff0c;原始集群(见下图)由6个节点组成&#xff0c;6个节点分布在三…...

2023全球数字贸易创新大赛-人工智能元宇宙-4-10

目录 竞赛感悟: 创业的话 好的项目 数字工厂,智慧制造:集群控制的安全问题...

go defer用法_类似与python_java_finially

defer 执行 时间 defer 一般 定义在 函数 开头, 但是 他会 最后 被执行 A defer statement defers the execution of a function until the surrounding function returns. 如果说 为什么 不在 末尾 定义 defer 呢, 因为 当 错误 发生时, 程序 执行 不到 末尾 就会 崩溃. d…...

Log4j2.xml不生效:WARN StatusLogger Multiple logging implementations found:

背景 将 -Dlog4j.debug 添加到IDEA的类的启动配置中 运行上图代码&#xff0c;这里log4j2.xml控制的日志级别是info&#xff0c;很明显是没生效。 DEBUG StatusLogger org.slf4j.helpers.Log4jLoggerFactory is not on classpath. Good! DEBUG StatusLogger Using Shutdow…...

【LeetCode】挑战100天 Day14(热题+面试经典150题)

【LeetCode】挑战100天 Day14&#xff08;热题面试经典150题&#xff09; 一、LeetCode介绍二、LeetCode 热题 HOT 100-162.1 题目2.2 题解 三、面试经典 150 题-163.1 题目3.2 题解 一、LeetCode介绍 LeetCode是一个在线编程网站&#xff0c;提供各种算法和数据结构的题目&…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

Linux部署私有文件管理系统MinIO

最近需要用到一个文件管理服务&#xff0c;但是又不想花钱&#xff0c;所以就想着自己搭建一个&#xff0c;刚好我们用的一个开源框架已经集成了MinIO&#xff0c;所以就选了这个 我这边对文件服务性能要求不是太高&#xff0c;单机版就可以 安装非常简单&#xff0c;几个命令就…...

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL

ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...

Vue 3 + WebSocket 实战:公司通知实时推送功能详解

&#x1f4e2; Vue 3 WebSocket 实战&#xff1a;公司通知实时推送功能详解 &#x1f4cc; 收藏 点赞 关注&#xff0c;项目中要用到推送功能时就不怕找不到了&#xff01; 实时通知是企业系统中常见的功能&#xff0c;比如&#xff1a;管理员发布通知后&#xff0c;所有用户…...

TJCTF 2025

还以为是天津的。这个比较容易&#xff0c;虽然绕了点弯&#xff0c;可还是把CP AK了&#xff0c;不过我会的别人也会&#xff0c;还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...