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.pswp.cn/news/160629.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/160629.shtml
英文地址,請注明出處:http://en.pswp.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;例如…