python运算符重载之构造函数和迭代器
1 python运算符重载之构造函数和迭代器
python运算符重载是在类方法中拦截内置操作-当类的实例使用内置操作时,pytho自动调用对应方法,并且返回操作结果。
| NO | # | 描述 |
|---|---|---|
| 1 | 拦截运算 | 运算符重载拦截内置操作,比如打印、函数调用、点号运算、表达式运算等 |
| 2 | 类似内置 | 重载运算符让类实例的行为类似内置操作 |
| 3 | 特定名称 | 运算符重载通过定义特定名称的类方法类实现 |
| 4 | 双下划线 | 重载的方法名前后都有双下划线 |
1.1 常见运算符重载
| NO | 方法 | 内置操作 | 描述 |
|---|---|---|---|
| 1 | init | 构造函数 | c=MyClass() |
| 2 | del | 析构函数 | 对象回收 |
| 3 | add | 运算符+ | 如果没有__iadd__,x+y,x+=y |
| 4 | or | 运算符| | 如果没有_ior__,x|y,x|=y |
| 5 | repr,str | 打印 | print(x)、repr(x)、str(x) |
| 6 | call | 函数调用 | x(*args,**kargs) |
| 7 | getattr | 点号运算 | x.attr |
| 8 | setattr | 属性赋值 | x.attr=value |
| 9 | delattr | 删除属性 | del x.attr |
| 10 | getattribute | 属性获取 | x.attr |
| 11 | getitem | 索引分片运算 | x[key],x[m:n] |
| 12 | setitem | 索引分片赋值 | x[key]=value,x[m:n]=序列 |
| 13 | delitem | 索引分片删除 | del[key],del[m:n] |
| 14 | len | 长度 | len(x) |
| 15 | bool | 布尔测试 | bool(x) |
| 16 | lt,gt,le,ge,eq,ne | 关系运算符 | x<y,x>y,x<=y,x>=y,x==y,x!=y |
| 17 | radd | 右侧加法 | Other+x |
| 18 | iadd | 增强加法 | x+=y |
| 19 | iter,next | 迭代环境 | I=iter(X),next(I),for循环 |
| 20 | contains | 成员关系 | item in x |
| 21 | index | 整数值 | hex(x),bin(x),oct(x),o(x) |
| 22 | enter,exit | 环境管理 | with obj as var: |
| 23 | get,set | 描述符属性 | x.attr,x.attr=value,dle x.attr |
| 24 | new | 创建 | 在__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=' ')
0 梯 1 阅 2 线 3 条 4
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运算符重载是在类方法中拦截内置操作-当类的实例使用内置操作时,pytho自动调用对应方法,并且返回操作结果。 NO#描述1拦截运算运算符重载拦截内置操作,比如打印、函数调用、点号运算、表达式运…...
【数据处理】Python:实现求条件分布函数 | 求平均值方差和协方差 | 求函数函数期望值的函数 | 概率论
猛戳订阅! 👉 《一起玩蛇》🐍 💭 写在前面:本章我们将通过 Python 手动实现条件分布函数的计算,实现求平均值,方差和协方差函数,实现求函数期望值的函数。部署的测试代码放到文后了,运行所需环境 python version >= 3.6,numpy >= 1.15,nltk >= 3.4,tqd…...
new/delete 和malloc/free的区别
C中: 创建单个数据空间: char *ch new char; delete ch; ch NULL; 创建多个数据空间: char *ch new char[4]; delete [] ch; ch NULL; C语言中: 创建单个数据空间: 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面试题——存储引擎相关
一:MySQL 支持哪些存储引擎? MySQL支持多种存储引擎,比如InnoDB,MyISAM, MySQL大于等于5.5之后,默认存储引擎是InnoDB 二:InnoDB 和 MyISAM 有什么区别? InnoDB支持事务,MyISAM不支持InnoD…...
趣学python编程 (四、数据结构和算法介绍)
数据结构和算法在编程中非常重要。数据结构是组织和存储数据的方式,而算法是解决问题的方法和步骤。你要挑战的蓝桥杯,实际也是在设计算法解决问题。其实各种编程语言都只是工具,而程序的核心数据结构算法。犹如练武,数据结构和算…...
使用Pandas进行时间重采样,充分挖掘数据价值
大家好,时间序列数据蕴含着很大价值,通过重采样技术可以提升原始数据的表现形式。本文将介绍数据重采样方法和工具,提升数据可视化技巧。 在进行时间数据可视化时,数据重采样是至关重要且非常有用的,它支持控制数据的…...
Django(九、choices参数的使用、多对多表的三种创建方式、Ajax技术)
文章目录 一、choices参数choices参数的用法choices 参数用法总结 二、MVC与MTV模式1.MVC2.MTV 三、多对多的三种创建方式1.全自动创建2.纯手动创建半自动创建 四、Django与Ajax1.什么是Ajax常见的场景Ajax案例 一、choices参数 在没有用到choices参数之前,我们在D…...
德语B级SampleAcademy
德语B级 一, 反身代词(1)A 主语和宾语一致(2)D 双宾语,主语与直接宾语不一致(3), 补充单词(4)真反身代词(5)假反身代词(6)真假反身代词(7)相互反身(8)非反身#反身#相互反身 二,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需要多步迭代采样才能生成一张图片,这导致生成速度很慢。一致性模型(Consistency models)的提出是为了加速生成过程。 Consistency models可以直接一步采样就生成图片,但是也允许进行多步采样来提高生成的质…...
杭电oj 2034 人见人爱A-B C语言
此处的c和a指向同一块内存空间,改变c就是改变a,反之亦然,此处是为了方便看这么写的,如果不想c和a指向同一空间请分别开辟空间(即不如此写camalloc) #include<stdio.h> #include<stdlib.h>int …...
springboot(ssm大学生成绩管理系统 成绩管理平台Java(codeLW)
springboot(ssm大学生成绩管理系统 成绩管理平台Java(code&LW) 开发语言:Java 框架:ssm/springboot vue JDK版本:JDK1.8(或11) 服务器:tomcat 数据库:mysql 5.7(或8.0&…...
SOME/IP 协议介绍(五)指南
指南(信息性) 选择传输协议 SOME/IP直接支持互联网上使用最广泛的两种传输协议:用户数据报协议(UDP)和传输控制协议(TCP)。UDP是一种非常简洁的传输协议,仅支持最重要的功能&#…...
Python调用企微机器人: 发送常用格式汇总
企微接口文档 发送应用消息 - 接口文档 - 企业微信开发者中心 发送格式 应用支持推送文本、图片、视频、文件、图文等类型。 ~~~以下列举常用格式 示例~~~ 1.发送文本 代码如下: def sendtxt_robotmsg(self):# 正式keywx_key "xx"wx_webhookurl htt…...
论文阅读——DiffusionDet
在目标检测上使用扩散模型 前向过程:真实框-->随机框 后向过程:随机框-->真实框 前向过程: 一般一张图片真实框的数目不同,填补到同一的N个框,填补方法可以是重复真实框,填补和图片大小一样的框&a…...
elmenetui表格二次封装包含查询框和分页
<!--dataList: 表格数据columnList: 表头字段 宽度minWidth使用slotName字段: 需要对列数据进行处理,不写prop字段,使用slotName字段btnText<String>: 按钮字段btnIcon<String>: 按钮的iconbtnEvent: 按钮事件btnType: 按钮类型getHeigh…...
【机器学习Python实战】线性回归
🚀个人主页:为梦而生~ 关注我一起学习吧! 💡专栏:机器学习python实战 欢迎订阅!后面的内容会越来越有意思~ ⭐内容说明:本专栏主要针对机器学习专栏的基础内容进行python的实现,部分…...
做外贸这么久,为什么一直做不好?
很多外贸业务员在开发客户过程中,总感觉自己做了很多事情,聊了很多客户,但却总是拿不到单子。 其实,这是由于缺乏对采购商心理的认识程度,没有换位思考,该做的事没做,不该做的事却忙得忘乎所以&…...
IPv4数据报格式
IPv4是IP协议的第四个版本(版本1-3和版本5都未曾使用过)IP地址不能反映任何有关主机位置的地理信息以前还有个逆地址解析协议RAPR(Reverse APR),它的作用是使只知道自己MAC地址的主机能通过RAPR找到其IP地址,而现在的DHCP(Dynamic Host Configuration Pr…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...
基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...
SQL Server 触发器调用存储过程实现发送 HTTP 请求
文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...
