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

python运算符重载之构造函数和迭代器

1 python运算符重载之构造函数和迭代器

python运算符重载是在类方法中拦截内置操作-当类的实例使用内置操作时,pytho自动调用对应方法,并且返回操作结果。

NO#描述
1拦截运算运算符重载拦截内置操作,比如打印、函数调用、点号运算、表达式运算等
2类似内置重载运算符让类实例的行为类似内置操作
3特定名称运算符重载通过定义特定名称的类方法类实现
4双下划线重载的方法名前后都有双下划线

1.1 常见运算符重载

NO方法内置操作描述
1init构造函数c=MyClass()
2del析构函数对象回收
3add运算符+如果没有__iadd__,x+y,x+=y
4or运算符|如果没有_ior__,x|y,x|=y
5repr,str打印print(x)、repr(x)、str(x)
6call函数调用x(*args,**kargs)
7getattr点号运算x.attr
8setattr属性赋值x.attr=value
9delattr删除属性del x.attr
10getattribute属性获取x.attr
11getitem索引分片运算x[key],x[m:n]
12setitem索引分片赋值x[key]=value,x[m:n]=序列
13delitem索引分片删除del[key],del[m:n]
14len长度len(x)
15bool布尔测试bool(x)
16ltgtlegeeqne关系运算符x<y,x>y,x<=y,x>=y,x==y,x!=y
17radd右侧加法Other+x
18iadd增强加法x+=y
19iternext迭代环境I=iter(X),next(I),for循环
20contains成员关系item in x
21index整数值hex(x),bin(x),oct(x),o(x)
22enterexit环境管理with obj as var:
23getset描述符属性x.attr,x.attr=value,dle x.attr
24new创建在__init__之前创建对象

1.2 init

python类调用小括号()创建实例时,会自动调用实例的构造函数__init__()。

>>> class A:def __init__(self):print('A.__init__')>>> class B(A):def __init__(self):print('B.__init__')>>> class C(A):pass>>> a=A()
A.__init__
# 子类和父类有init,自动调用子类init
>>> b=B()
B.__init__
# 子类无init,自动调用父类init
>>> c=C()
A.__init__

1.3 sub

python实例使用减法-表达式,会自动调用实例的__sub__()方法。

>>> class MyNumber:def __init__(self,begin):self.data=begindef __sub__(self,other):# 拦截减法(-)表达式return MyNumber(self.data-other)>>> n1=MyNumber(5)
>>> n2=n1-3
>>> n2.data
2

1.4 getitem__和__setitem

python实例使用索引和分片获取值时,会自动调用实例的__getitem__()方法;

设置值时,会自动调用__setitem方法;

迭代环境会自动调用__getitem__()方法;

>>> class MyIndex:def __getitem__(self,index):# []索引获取值时调用getitemreturn index*2
>>> mi=MyIndex()
>>> mi[2]
4
>>> for i in range(5):print(mi[i],end=' ')
0 2 4 6 8 
>>> class MySlice:data=[9,7,5,2,6,8]def __getitem__(self,index):# [:]分片获取值时调用getitemprint('索引:',index)return self.data[index]>>> ms=MySlice()
>>> ms[0]
索引: 0
9
>>> ms[1]
索引: 1
7
>>> ms[-1]
索引: -1
8
>>> ms[3:6]
索引: slice(3, 6, None)
[2, 6, 8]
>>> ms[1:]
索引: slice(1, None, None)
[7, 5, 2, 6, 8]
>>> ms[:-1]
索引: slice(None, -1, None)
[9, 7, 5, 2, 6]
>>> ms[::2]
索引: slice(None, None, 2)
[9, 5, 6]>>> class MySetitem:def __init__(self):self.changed={}def __setitem__(self,key,value):# 索引[]设置值时调用setitemself.changed[key]=valuedef __getitem__(self,key):return self.changed[key]
>>> ms=MySetitem()
>>> ms['s']='梯阅线条'
>>> ms['s']
'梯阅线条'>>> class MyStep:def __getitem__(self,i):# for循环迭代时调用getitemprint(i,end = ' ')return self.data[i]
>>> ms=MyStep()
>>> ms.data='梯阅线条'
>>> ms[0]
0 '梯'
>>> for item in ms:print(item,end=' ')
012 线 34 

1.5 iter__和__next

python迭代环境先调用__iter__()方法,不存在时再调用__getitem__()方法进行索引操作。

iter()方法返回迭代对象,迭代对象循环调用__next__()方法,直到发生StopIteration异常。

迭代环境循环调用__getitem__()方法,直到发生IndexError异常。

迭代器对象:具有__next__方法的对象;

可迭代对象:具有__iter__方法的对象;

可迭代对象调用__iter__方法,返回迭代器对象,再调用__next__方法;

1.5.1 单迭代器对象

iter()方法返回实例对象本身,为单迭代器对象,生成器函数和表达式、map、zip等;

>>> class MyIter:def __init__(self,start,stop):self.value=start-1self.stop=stop# 可迭代迭代对象拥有__iter__方法,返回迭代器对象    def __iter__(self):return selfdef __next__(self):# 迭代器对象拥有__next__方法if self.value==self.stop:raise StopIterationself.value+=1return self.value*2>>> for i in MyIter(1,5):# for迭代环境循环调用迭代器对象的next方法print(i,end=' ')
2 4 6 8 10 
>>> mi=MyIter(1,5)
>>> i=iter(mi)#等效于mi.__iter__()
>>> i
<__main__.MyIter object at 0x01269A50>
# 等效于 i.__next__()
>>> next(i)
2
>>> next(i)
4
>>> next(i)
6
>>> next(i)
8
>>> next(i)
10
>>> next(i)
Traceback (most recent call last):File "<pyshell#146>", line 1, in <module>next(i)File "<pyshell#134>", line 9, in __next__raise StopIteration
StopIteration>>> [i for i in MyIter(1,5)]
[2, 4, 6, 8, 10]
>>> [i for i in MyIter(1,5)]
[2, 4, 6, 8, 10]
# mi的__iter__()返回实例本身,为单次迭代器
# 类似的有生成器函数和表达式、map、zip
>>> mi=MyIter(1,5)
>>> [i for i in mi]
[2, 4, 6, 8, 10]
>>> [i for i in mi]
[]
>>> mi=MyIter(1,5)
>>> for x in mi:for y in mi:print(x+y,end=' ')   
6 8 10 12 
>>> def mygenerate(start,stop):for i in range(start,stop+1):yield i*2>>> for i in mygenerate(1,5):print(i,end=' ')2 4 6 8 10 

1.5.2 多迭代器对象

iter()方法返回新迭代器对象,为多迭代器对象,比如range、列表等;

class MySkipIterator:def __init__(self,wrapped):self.wrapped=wrappedself.offset=0# 迭代器对象拥有__next__方法def __next__(self):print('__next__')# 证明 __next__ 被调用if self.offset>=len(self.wrapped):print('StopIteration')raise StopIterationelse:item=self.wrapped[self.offset]self.offset+=2return item
class MySkipObject:def __init__(self,wrapped):self.wrapped=wrapped# 可迭代迭代对象拥有__iter__方法,# 返回拥有__next__方法的迭代器对象def __iter__(self):# __iter__返回新的迭代器对象,为多个迭代器对象# 类似的有range、列表等print('__iter__')# 证明 __iter__ 被调用return MySkipIterator(self.wrapped)if __name__ == '__main__':s1='abcdef'mso=MySkipObject(s1)i=iter(mso)print(next(i),next(i),next(i))print('================')#for循环先调用iter生成迭代器,再一直调用next方法只到报错for x in mso:print(x,end=' ')print('================')for x in mso:for y in mso:print(x+y,end=' ')
'''
C:\Users\Administrator\Desktop>python "新文件 1.py"
__iter__
__next__
__next__
__next__
a c e
================
__iter__
__next__
a __next__
c __next__
e __next__
StopIteration
================
__iter__
__next__
__iter__
__next__
aa __next__
ac __next__
ae __next__
StopIteration
__next__
__iter__
__next__
ca __next__
cc __next__
ce __next__
StopIteration
__next__
__iter__
__next__
ea __next__
ec __next__
ee __next__
StopIteration
__next__
StopIteration
'''

相关文章:

python运算符重载之构造函数和迭代器

1 python运算符重载之构造函数和迭代器 python运算符重载是在类方法中拦截内置操作-当类的实例使用内置操作时&#xff0c;pytho自动调用对应方法&#xff0c;并且返回操作结果。 NO#描述1拦截运算运算符重载拦截内置操作&#xff0c;比如打印、函数调用、点号运算、表达式运…...

【数据处理】Python:实现求条件分布函数 | 求平均值方差和协方差 | 求函数函数期望值的函数 | 概率论

猛戳订阅! 👉 《一起玩蛇》🐍 💭 写在前面:本章我们将通过 Python 手动实现条件分布函数的计算,实现求平均值,方差和协方差函数,实现求函数期望值的函数。部署的测试代码放到文后了,运行所需环境 python version >= 3.6,numpy >= 1.15,nltk >= 3.4,tqd…...

new/delete 和malloc/free的区别

C中&#xff1a; 创建单个数据空间&#xff1a; char *ch new char; delete ch; ch NULL; 创建多个数据空间&#xff1a; char *ch new char[4]; delete [] ch; ch NULL; C语言中&#xff1a; 创建单个数据空间&#xff1a; char *ch malloc(sizeof(char)); fre…...

Linux程序设计(上)

系列文章目录 文章目录 系列文章目录前言一、unix, linux, GNU, POSIXLinux程序 二、shellshell语法1.变量2.语句 函数命令命令的执行dialog工具-- 三、文件操作1. Linux 文件结构2. 系统调用和设备驱动程序3. 库函数4. 底层文件访问5. 标准I/O库6.格式化输入输出7. 文件和目录…...

mysql面试题——存储引擎相关

一&#xff1a;MySQL 支持哪些存储引擎? MySQL支持多种存储引擎&#xff0c;比如InnoDB&#xff0c;MyISAM&#xff0c; MySQL大于等于5.5之后&#xff0c;默认存储引擎是InnoDB 二&#xff1a;InnoDB 和 MyISAM 有什么区别? InnoDB支持事务&#xff0c;MyISAM不支持InnoD…...

趣学python编程 (四、数据结构和算法介绍)

数据结构和算法在编程中非常重要。数据结构是组织和存储数据的方式&#xff0c;而算法是解决问题的方法和步骤。你要挑战的蓝桥杯&#xff0c;实际也是在设计算法解决问题。其实各种编程语言都只是工具&#xff0c;而程序的核心数据结构算法。犹如练武&#xff0c;数据结构和算…...

使用Pandas进行时间重采样,充分挖掘数据价值

大家好&#xff0c;时间序列数据蕴含着很大价值&#xff0c;通过重采样技术可以提升原始数据的表现形式。本文将介绍数据重采样方法和工具&#xff0c;提升数据可视化技巧。 在进行时间数据可视化时&#xff0c;数据重采样是至关重要且非常有用的&#xff0c;它支持控制数据的…...

Django(九、choices参数的使用、多对多表的三种创建方式、Ajax技术)

文章目录 一、choices参数choices参数的用法choices 参数用法总结 二、MVC与MTV模式1.MVC2.MTV 三、多对多的三种创建方式1.全自动创建2.纯手动创建半自动创建 四、Django与Ajax1.什么是Ajax常见的场景Ajax案例 一、choices参数 在没有用到choices参数之前&#xff0c;我们在D…...

德语B级SampleAcademy

德语B级 一, 反身代词&#xff08;1&#xff09;A 主语和宾语一致&#xff08;2&#xff09;D 双宾语&#xff0c;主语与直接宾语不一致(3), 补充单词&#xff08;4&#xff09;真反身代词(5)假反身代词(6)真假反身代词(7)相互反身(8)非反身#反身#相互反身 二&#xff0c;Nomen…...

vue3自定义hooks

获取dom的id属性 index.ts import { onMounted } from "vue" type option {el: string }export default function(option:option):Promise<{name: string}> {return new Promise((resolve)>{onMounted(()>{const dom:HTMLElement document.querySele…...

Consistency Models 阅读笔记

简介 Diffusion models需要多步迭代采样才能生成一张图片&#xff0c;这导致生成速度很慢。一致性模型&#xff08;Consistency models&#xff09;的提出是为了加速生成过程。 Consistency models可以直接一步采样就生成图片&#xff0c;但是也允许进行多步采样来提高生成的质…...

杭电oj 2034 人见人爱A-B C语言

此处的c和a指向同一块内存空间&#xff0c;改变c就是改变a&#xff0c;反之亦然&#xff0c;此处是为了方便看这么写的&#xff0c;如果不想c和a指向同一空间请分别开辟空间&#xff08;即不如此写camalloc&#xff09; #include<stdio.h> #include<stdlib.h>int …...

springboot(ssm大学生成绩管理系统 成绩管理平台Java(codeLW)

springboot(ssm大学生成绩管理系统 成绩管理平台Java(code&LW) 开发语言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&#xff08;或8.0&…...

SOME/IP 协议介绍(五)指南

指南&#xff08;信息性&#xff09; 选择传输协议 SOME/IP直接支持互联网上使用最广泛的两种传输协议&#xff1a;用户数据报协议&#xff08;UDP&#xff09;和传输控制协议&#xff08;TCP&#xff09;。UDP是一种非常简洁的传输协议&#xff0c;仅支持最重要的功能&#…...

Python调用企微机器人: 发送常用格式汇总

企微接口文档 发送应用消息 - 接口文档 - 企业微信开发者中心 发送格式 应用支持推送文本、图片、视频、文件、图文等类型。 ~~~以下列举常用格式 示例~~~ 1.发送文本 代码如下&#xff1a; def sendtxt_robotmsg(self):# 正式keywx_key "xx"wx_webhookurl htt…...

论文阅读——DiffusionDet

在目标检测上使用扩散模型 前向过程&#xff1a;真实框-->随机框 后向过程&#xff1a;随机框-->真实框 前向过程&#xff1a; 一般一张图片真实框的数目不同&#xff0c;填补到同一的N个框&#xff0c;填补方法可以是重复真实框&#xff0c;填补和图片大小一样的框&a…...

elmenetui表格二次封装包含查询框和分页

<!--dataList: 表格数据columnList: 表头字段 宽度minWidth使用slotName字段: 需要对列数据进行处理&#xff0c;不写prop字段&#xff0c;使用slotName字段btnText<String>: 按钮字段btnIcon<String>: 按钮的iconbtnEvent: 按钮事件btnType: 按钮类型getHeigh…...

【机器学习Python实战】线性回归

&#x1f680;个人主页&#xff1a;为梦而生~ 关注我一起学习吧&#xff01; &#x1f4a1;专栏&#xff1a;机器学习python实战 欢迎订阅&#xff01;后面的内容会越来越有意思~ ⭐内容说明&#xff1a;本专栏主要针对机器学习专栏的基础内容进行python的实现&#xff0c;部分…...

做外贸这么久,为什么一直做不好?

很多外贸业务员在开发客户过程中&#xff0c;总感觉自己做了很多事情&#xff0c;聊了很多客户&#xff0c;但却总是拿不到单子。 其实&#xff0c;这是由于缺乏对采购商心理的认识程度&#xff0c;没有换位思考&#xff0c;该做的事没做&#xff0c;不该做的事却忙得忘乎所以&…...

IPv4数据报格式

IPv4是IP协议的第四个版本(版本1-3和版本5都未曾使用过)IP地址不能反映任何有关主机位置的地理信息以前还有个逆地址解析协议RAPR(Reverse APR)&#xff0c;它的作用是使只知道自己MAC地址的主机能通过RAPR找到其IP地址&#xff0c;而现在的DHCP(Dynamic Host Configuration Pr…...

Verilog编程技巧01——如何编写三段式状态机

前言 Verilog编程技巧系列文章将聚焦于介绍Verilog的各种编程范式或者说技巧&#xff0c;编程技巧和编程规范有部分重合&#xff0c;但并非完全一样。规范更注重编码的格式&#xff0c;像变量命名、缩进、注释风格等&#xff0c;而编程技巧则更偏重更直观易读、更便于维护、综合…...

boost::qvm 使用示例

boost::qvm 使用示例 boost::qvm (Quaternions, Vectors and Matrices) 是 Boost 库中的一个组件&#xff0c;专门用于处理向量、矩阵和四元数运算。以下是几个常见的使用示例&#xff1a; 基本向量操作 #include <boost/qvm/vec.hpp> #include <boost/qvm/vec_ope…...

C#入门学习笔记 #6(字段、属性、索引器、常量)

欢迎进入这篇文章&#xff0c;文章内容为学习C#过程中做的笔记&#xff0c;可能有些内容的逻辑衔接不是很连贯&#xff0c;但还是决定分享出来&#xff0c;由衷的希望可以帮助到你。 笔记内容会持续更新~~ 将这四种成语放在一起讲是因为这四种成员都是用来表达数据的。 字段…...

python项目如何创建docker环境

这里写自定义目录标题 python项目创建docker环境docker配置国内镜像源构建一个Docker 镜像验证镜像合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPant…...

宝马集团推进数字化转型:强化生产物流与财务流程,全面引入SAP现代架构

2025年6月&#xff0c;宝马集团宣布在生产物流与财务流程领域取得重大数字化成果。这些进展标志着集团全球范围内采用基于云的新型SAP架构进入关键阶段&#xff0c;旨在提升运营效率、透明度和AI能力&#xff0c;为未来工业发展奠定技术基础。 一、生产物流全球数字化部署 宝…...

jvm学习第1day jvm简介,栈溢出、堆溢出

jvm学习第1day jvm简介&#xff0c;栈溢出、堆溢出 jvm简介栈线程安全栈溢出线程运行诊断堆堆溢出 方法区方法区内存溢出常量池和运行时常量池 jvm简介 jvm 是编译后的字节码文件运行的环境&#xff0c; 因此各个平台有了jvm可以运行java.class文件&#xff0c;这是Java跨平台…...

Dify工作流实践—根据word需求文档编写测试用例到Excel中

前言 这篇文章依赖到的操作可查阅我之前的文章&#xff1a; dify里的大模型是怎么添加进来的&#xff1a;在Windows本地部署Dify详细操作 flask 框架app.route()函数的开发和调用&#xff1a;PythonWeb开发框架—Flask工程创建和app.route使用详解 结构化提示词的编写&…...

nvidia系列教程-agx-orin安装ros

目录 前言 一、安装前的准备工作 二、ROS安装 三、ROS验证 总结 前言 在机器人开发、自动驾驶等领域,NVIDIA Jetson AGX Orin 凭借其强大的算力成为开发者的得力工具。而 ROS(Robot Operating System)作为机器人领域广泛使用的开源框架,为开发者提供了丰富的功能和工具。…...

Spring IoC 详解:原理、实现与实战

Spring IoC 详解&#xff1a;原理、实现与实战 前言 Spring IoC&#xff08;Inversion of Control&#xff0c;控制反转&#xff09;是Spring框架的核心基础。它通过解耦对象的创建与依赖关系管理&#xff0c;极大提升了系统的可维护性和扩展性。本文将系统梳理Spring IoC的原…...

基于cornerstone3D的dicom影像浏览器 第二十八章 LabelTool文字标记,L标记,R标记及标记样式设置

文章目录 前言一、L标记、R标记二、修改工具样式1. 样式的四种级别2. 导入annotation3. 示例1 - 修改toolGroup中的样式4. 示例2 - 修改viewport中的样式 三、可配置样式 前言 cornerstone3D 中的文字标记工具LabelTool&#xff0c;在添加文字标记时会弹出对话框让用户输入文字…...