python运算符重载之成员关系和属性运算

1 python运算符重载之成员关系和属性运算

1.1 重载成员关系运算符

1.1.1 contains,iter,getitem

python使用成员关系运算符in时,

按优先级调用方法:contains>iter>getitem

class MyIters:def __init__(self,value):self.data=valuedef __getitem__(self,i):print('get[{}]:'.format(i),end='')return self.data[i]#def __iter__(self):#   print('iter=> ',end='')#   self.ix=0#   return self#def __next__(self):#   print('next:',end='')#   if self.ix==len(self.data):#       raise StopIteration#   item=self.data[self.ix]#   self.ix+=1#   return item#def __contains__(self,x):#   print('contains: ',end='')#   return x in self.dataif __name__ == '__main__':mi=MyIters('tyxt')print('t' in mi)# in 按 contains > iter> getitem顺序调用for i in mi:# for 调用 iter 和 next 、 getitemprint(i,end=' | ')print()print([i*2 for i in mi])print(list(map(ord,mi)))i=iter(mi)while True:try:print(next(i),end='#')except StopIteration:break
''' #未注释contains,按contains>iter>getitem顺序调用
E:\documents\F盘>python myIn.py
contains: True
iter=> next:t | next:y | next:x | next:t | next:
iter=> next:next:next:next:next:['tt', 'yy', 'xx', 'tt']
iter=> next:next:next:next:next:[116, 121, 120, 116]
iter=> next:t#next:y#next:x#next:t#next:
E:\documents\F盘>
'''
''' #注释contains,按contains>iter>getitem顺序调用
E:\documents\F盘>python myIn.py
iter=> next:True
iter=> next:t | next:y | next:x | next:t | next:
iter=> next:next:next:next:next:['tt', 'yy', 'xx', 'tt']
iter=> next:next:next:next:next:[116, 121, 120, 116]
iter=> next:t#next:y#next:x#next:t#next:
'''
''' #注释contains 和 iter ,按contains>iter>getitem顺序调用
E:\documents\F盘>python myIn.py
get[0]:True
get[0]:t | get[1]:y | get[2]:x | get[3]:t | get[4]:
get[0]:get[1]:get[2]:get[3]:get[4]:['tt', 'yy', 'xx', 'tt']
get[0]:get[1]:get[2]:get[3]:get[4]:[116, 121, 120, 116]
get[0]:t#get[1]:y#get[2]:x#get[3]:t#get[4]:
'''

1.2 重载属性运算符

1.2.1 getattr

python的__getattr__方法,拦截不存在的或未定义的属性点号运算。

>>> class MyGet:# 通过点号运算访问不存在的属性时自动调用getattrdef __getattr__(self,attr):if attr=='name':return '梯阅线条'else:raise AttributeError(attr)
>>> mg=MyGet()
>>> mg.name
'梯阅线条'
>>> mg.age
Traceback (most recent call last):File "<pyshell#28>", line 1, in <module>mg.ageFile "<pyshell#25>", line 6, in __getattr__raise AttributeError(attr)
AttributeError: age
# 存在的属性不会调用getattr
>>> mg.addr='深圳'
>>> mg.addr
'深圳'

1.2.2 setattr

python的__setattr__方法,会拦截全部的属性赋值语句。

实现__setattr__方法时,必须通过属性字典进行赋值,

如果通过点号赋值,会自动调用__setattr__方法,进入无限循环,导致堆栈溢出程序异常。

>>> class MySet:# 通过点号运算给属性赋值时自动调用 setattr 方法def __setattr__(self,attr,value):if attr=='name':# 必须通过字典属性赋值方式实现self.__dict__[attr]=valueelse:raise AttributeError(attr+' 禁止设置')
>>> ms=MySet()
>>> ms.name='梯阅线条'
>>> ms.name
'梯阅线条'
>>> ms.age=9555
Traceback (most recent call last):File "<pyshell#43>", line 1, in <module>ms.age=9555File "<pyshell#39>", line 6, in __setattr__raise AttributeError(attr+' 禁止设置')
AttributeError: age 禁止设置

1.2.3 私有属性列表

通过setattr拦截属性赋值,如果在私有属性列表里面,禁止赋值。

>>> class MyPrivateExc(Exception):pass
>>> class MyPrivacy:def __setattr__(self,attr,value):# 私有变量名列表,禁止赋值操作if attr in self.privates:raise MyPrivateExc(attr,self)else:self.__dict__[attr]=value       
>>> class MyTest1(MyPrivacy):privates=['age']    
>>> class MyTest2(MyPrivacy):privates=['name','pay']def __init__(self):self.__dict__['name']='梯阅线条'
>>> mt1=MyTest1()
>>> mt2=MyTest2()
>>> mt1.name='张三'
>>> mt2.name='李四'
Traceback (most recent call last):File "<pyshell#71>", line 1, in <module>mt2.name='李四'File "<pyshell#52>", line 4, in __setattr__raise MyPrivateExc(attr,self)
MyPrivateExc: ('name', <__main__.MyTest2 object at 0x00E3F650>)
>>> mt1.age=9555
Traceback (most recent call last):File "<pyshell#72>", line 1, in <module>mt1.age=9555File "<pyshell#52>", line 4, in __setattr__raise MyPrivateExc(attr,self)
MyPrivateExc: ('age', <__main__.MyTest1 object at 0x00E3F630>)
>>> mt2.age=9555
>>> mt2.age
9555
>>> mt2.name
'梯阅线条'

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

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

相关文章

2023年【安全生产监管人员】考试题及安全生产监管人员找解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全生产监管人员考试题参考答案及安全生产监管人员考试试题解析是安全生产模拟考试一点通题库老师及安全生产监管人员操作证已考过的学员汇总&#xff0c;相对有效帮助安全生产监管人员找解析学员顺利通过考试。 1、…

【树莓派】Camera Module 使用

工具 RPI4RPI Camera Module 2 硬件安装 直接插到板子的相机带子插口上即可 使用前提 libcamera-hello运行这个命令能够成功&#xff0c;否则需要装相应的包 在 RPI4 上测试 libcamera-jpeg -o 00001.jpg -t 2000 --width 640 --height 480t 表示程序运行&#xff08;预…

SA8255 Q+A android 登录QNX

需要工具busybox 130|gen4_gvm:/ # cd /data/ gen4_gvm:/data # ./busybox telnet 192.168.1.1Entering character mode Escape character is ^].QNX Neutrino (localhost) (ttyp0)login: root No home directory. Logging in with home "/". # 用户名&#xff1a…

数据结构-栈的实现

1.栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 压栈&…

Matlab群体智能优化算法之海象优化算法(WO)

文章目录 一、灵感来源二、算法的初始化三、GTO的数学模型Phase1&#xff1a;危险信号和安全信号Phase2&#xff1a;迁移&#xff08;探索&#xff09;Phase3&#xff1a;繁殖&#xff08;开发&#xff09; 四、流程图五、伪代码六、算法复杂度七、WO搜索示意图八、实验分析和结…

FreeRTOS列表和列表项

FreeRTOS内核调度使用了大量的列表&#xff08;list&#xff09;和列表项&#xff08;listitem&#xff09;数据结构。它的源码中涉及到很多列表的操作&#xff0c;对于FreeRTOS来说&#xff0c;列表就是它最基础的一部分&#xff0c;列表被用作FreeRTOS调度器使用&#xff0c;…

力扣.面试题 04.06. 后继者(java 树的中序遍历)

Problem: 面试题 04.06. 后继者 文章目录 题目描述思路解题方法复杂度Code 题目描述 设计一个算法&#xff0c;找出二叉搜索树中指定节点的“下一个”节点&#xff08;也即中序后继&#xff09;。 如果指定节点没有对应的“下一个”节点&#xff0c;则返回null。 思路 由于题…

lombok @Slf4j注解啥作用

Logger logger Logger.getLogger(Test.class); logger.debug("这是一个调试信息"); logger.info("这是一个info信息");log4j 使用分两步 第一步&#xff1a;private final Logger logger LoggerFactory.getLogger(当前类名.class); 第二步&#xff1a;记…

Python开发运维:Celery连接Redis

目录 一、理论 1.Celery 二、实验 1.Windows11安装Redis 2.Python3.8环境中配置Celery 三、问题 1.Celery命令报错 2.执行Celery命令报错 3.Win11启动Celery报ValueErro错误 一、理论 1.Celery (1) 概念 Celery是一个基于python开发的分布式系统&#xff0c;它是简单…

Linux 命令: cut 和 tr

1. 写在前面 本文主要介绍&#xff1a;Linux "cut "和 “tr” 命令行实用程序概述&#xff1b; 公众号&#xff1a; 滑翔的纸飞机 2. Linux 命令&#xff1a; cut “cut” 命令是一种命令行工具&#xff0c;允许我们剪切指定文件或管道数据的部分内容&#xff0c;并…

JSP内置对象

一、request对象 1、访问请求参数 2、在作用域中管理属性 3、获取Cookie 4、解决中文乱码 5、获取客户端信息 6、显示国际化信息 是一个javax.servlet.http.HttpServletRequest对象 request封装了用户浏览器提交的信息&#xff0c;因此可以调用相应的方法可以获取这些封…

优先经验回放(prioritized experience replay)

prioritized experience replay 思路 优先经验回放出自ICLR 2016的论文《prioritized experience replay》。 prioritized experience replay的作者们认为&#xff0c;按照一定的优先级来对经验回放池中的样本采样&#xff0c;相比于随机均匀的从经验回放池中采样的效率更高&…

UML建模图文详解教程——类图

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl本文参考资料&#xff1a;《UML面向对象分析、建模与设计&#xff08;第2版&#xff09;》吕云翔&#xff0c;赵天宇 著 类图概述 类图用来描述系统内各种实体的类型以及不同…

Unsupervised MVS论文笔记

Unsupervised MVS论文笔记 摘要1 引言2 相关工作3 实现方法 Tejas Khot and Shubham Agrawal and Shubham Tulsiani and Christoph Mertz and Simon Lucey and Martial Hebert. Tejas Khot and Shubham Agrawal and Shubham Tulsiani and Christoph Mertz and Simon Lucey and …

JAVA小游戏拼图

第一步是创建项目 项目名自拟 第二部创建个包名 来规范class 然后是创建类 创建一个代码类 和一个运行类 代码如下&#xff1a; package heima; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import …

10、信息打点——APP小程序篇抓包封包XP框架反编译资产提取

APP信息搜集思路 外在——抓包封包——资产安全测试 抓包&#xff08;Fiddle&茶杯&burp&#xff09;封包&#xff08;封包监听工具&#xff09;&#xff0c;提取资源信息 资产收集——资源提取——ICO、MAD、hash——FOFA等网络测绘进行资产搜集 外在——功能逻辑 内在…

国际版Amazon Lightsail的功能解析

Amazon Lightsail是一项易于使用的云服务,可为您提供部署应用程序或网站所需的一切,从而实现经济高效且易于理解的月度计划。它是部署简单的工作负载、网站或开始使用亚马逊云科技的理想选择。 作为 AWS 免费套餐的一部分&#xff0c;可以免费开始使用 Amazon Lightsail。注册…

【Python进阶】近200页md文档14大体系第4篇:Python进程使用详解(图文演示)

本文从14大模块展示了python高级用的应用。分别有Linux命令&#xff0c;多任务编程、网络编程、Http协议和静态Web编程、htmlcss、JavaScript、jQuery、MySql数据库的各种用法、python的闭包和装饰器、mini-web框架、正则表达式等相关文章的详细讲述。 Python全套笔记直接地址…

PostgreSQL10安装postgis插件

1.安装pgsql10 2.下载插件&#xff0c;以Windows为例&#xff0c;地址&#xff1a;Index of /postgis/windows/pg10/ 3.安装插件&#xff0c;直接安装&#xff0c;和pgsql的目录相同即可&#xff0c;一直下一步 4.安装之后&#xff0c;需要执行sql打开 CREATE EXTENSION po…

028 - STM32学习笔记 - ADC结构体学习(二)

028 - STM32学习笔记 - 结构体学习&#xff08;二&#xff09; 上节对ADC基础知识进行了学习&#xff0c;这节在了解一下ADC相关的结构体。 一、ADC初始化结构体 在标准库函数中基本上对于外设都有一个初始化结构体xx_InitTypeDef&#xff08;其中xx为外设名&#xff0c;例如…