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__

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/167700.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/167700.shtml
英文地址,請注明出處:http://en.pswp.cn/news/167700.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深入理解C語言指針基礎概念:定義、內存地址與聲明初始化

導言&#xff1a; 在C語言中&#xff0c;指針是一項強大而重要的概念&#xff0c;直接涉及內存的底層操作。理解指針的基礎概念對于熟練運用C語言以及理解底層系統工作原理至關重要。本文將深入研究指針的定義、內存地址的概念以及指針的聲明和初始化&#xff0c;幫助讀者建立對…

C++之unordered_map/set的使用

前面我們已經學習了STL中底層為紅黑樹結構的一系列關聯式容器——set/multiset 和 map/multimap(C98). unordered系列關聯式容器 在C98中, STL提供了底層為紅黑樹結構的一系列關聯式容器, 在查詢時效率可達到log2N,即最差情況下需要比較紅黑樹的高度次, 當樹中的節點非常多時,…

3 動態規劃解解碼問題

來源&#xff1a;LeetCode第91題 難度&#xff1a;中等 描述&#xff1a;一條包含字母A-Z的消息通過以下映射進行了編碼: A->1,B->2,z->26,要接嗎已編碼的消息&#xff0c;所有數字必須基于上述映射的方法&#xff0c;反向映射回字母(可能由多種方法)&#xff0c;例…

MindStudio學習一 整體介紹

一場景介紹 二 安裝介紹 1.LINUX 采用無昇騰硬件采用linux 分部署 2.WINDOWS 3.linux下安裝整體步驟 3.1安裝依賴 3.2 安裝步驟 1.gcc cmake 等依賴 2.python3.7.5 3.pip 安裝依賴 4.安裝JDK 5.安裝 Ascend-cann-toolkit 6.解壓安裝Mindstudio 7.進入bin路徑 ./…

MySQL where 子句

文章目錄 前言MySQL where 子句語法 從命令提示符中讀取數據使用PHP腳本讀取數據后言 前言 hello world歡迎來到前端的新世界 &#x1f61c;當前文章系列專欄&#xff1a;Mysql &#x1f431;?&#x1f453;博主在前端領域還有很多知識和技術需要掌握&#xff0c;正在不斷努力…

Javascript的form表單校驗輸入框

以下是HTML代碼&#xff1a; <form name"myForm" onsubmit"return validateForm()"><label for"name">姓名&#xff1a;</label><input type"text" id"name" name"name"><br><l…

【ArcGIS Pro微課1000例】0035:柵格影像拼接(dem高程數據)

本實驗講解在ArcGIS Pro中,柵格數據的兩種拼接(鑲嵌)方法,適用于遙感影像、DOM、DEM、DSM等常見柵格數據。 文章目錄 一、加載實驗數據二、柵格拼接工具1. 鑲嵌2. 鑲嵌至新柵格三、注意事項四、拓展閱讀一、加載實驗數據 加載配套實驗數據中的0035.rar中的兩個dem數據,如…

455.分發餅干

原題鏈接&#xff1a;455.分發餅干 思路&#xff1a; 先使用大餅干喂飽大胃口的&#xff0c;再到剩余的里面用大餅干喂剩下大胃口的 &#xff0c;直到全部滿足或者喂不了了為止。 全代碼&#xff1a; class Solution { public:int findContentChildren(vector<int>&am…

【從刪庫到跑路】MySQL數據庫 — E-R圖 | 關系模型

&#x1f38a;專欄【MySQL】 &#x1f354;喜歡的詩句&#xff1a;更喜岷山千里雪 三軍過后盡開顏。 &#x1f386;音樂分享【如愿】 大一同學小吉&#xff0c;歡迎并且感謝大家指出我的問題&#x1f970; 文章目錄 &#x1f339;簡述什么是E-R圖?核心概念 &#x1f339;E-R圖…

LeetCode40. Combination Sum II

文章目錄 一、題目二、題解 一、題目 Given a collection of candidate numbers (candidates) and a target number (target), find all unique combinations in candidates where the candidate numbers sum to target. Each number in candidates may only be used once in…

完美解決:Nginx訪問PHP出現File not found.

目錄 解決方法一&#xff1a; 解決方法二&#xff1a; 遇到 File not found. 出現的問題解決&#xff1a; 解決方法一&#xff1a; 修改nginx的主配置文件。 vi /etc/nginx/nginx.conf location ~ \.php$ { root html; fastcgi_pass …

unity Toggle,初始時默認不選中,若選中則不可取消選中。不寫碼實現其效果

實現效果&#xff1a; 初始默認時&#xff1a; 選中時&#xff1a; 零代碼實現&#xff1a; 步驟1 步驟2 步驟3

[autojs]ui線程中更新控件的值的問題

"ui"; ui.layout(<vertical><button id"autoFloatWindow" text"開啟懸浮窗" textSize"15sp" /><button id"autoService" text"開啟無障礙服務" textSize"15sp" /><button id"…

一篇總結 Linux 系統啟動的幾個匯編指令

學習 Linux 系統啟動流程&#xff0c;必須熟悉幾個匯編指令&#xff0c;總結給大家。 這里不是最全的&#xff0c;只列出一些最常用的匯編指令。 一&#xff0e;數據處理指令 1.數據傳送指令 【MOV指令】 把一個寄存器的值(立即數)賦給另一個寄存器&#xff0c;或者將一個…

Python---函數的參數類型

位置參數 理論上&#xff0c;在函數定義時&#xff0c;我們可以為其定義多個參數。但是在函數調用時&#xff0c;我們也應該傳遞多個參數&#xff0c;正常情況&#xff0c;其要一一對應。 相關鏈接&#xff1a;Python---函數的作用&#xff0c;定義&#xff0c;使用步驟&…

opencv 常用操作指南

1.通道交換 讀取圖像&#xff0c;然后將RGB通道替換成BGR通道&#xff0c;需要注意的是&#xff0c;opencv讀取的圖像默認是BGR。cv2.cvtColor函數可以參考Color Space Conversions img cv2.imread(imori.jpg) img cv2.cvtColor(img, cv2.COLOR_BGR2RGB) cv2.imwrite(answe…

1|1111

1、指定在每天凌晨4&#xff1a;00將該時間點之前的系統日志信息&#xff08;/var/log/messages &#xff09;備份到目錄下/backup&#xff0c;備份后日志文件名顯示格式logfileYY-MM-DD-HH-MM 2、配置ssh免密登陸&#xff1a;客戶端主機通過redhat用戶基于秘鑰驗證方式進行遠…

微服務實戰系列之Nginx

前言 Nginx&#xff1f;寫了那么多文章&#xff0c;為什么今天才輪到它的表演&#xff1f;那是因為它實在太重要了&#xff0c;值得大書特書&#xff0c;特別對待。 當我們遇到單點瓶頸&#xff0c;第一個idea是&#xff1f;Nginx&#xff1b; 當我們需要反向代理&#xff0c;…

機器學習/sklearn筆記:MeanShift

1 算法介紹 一種基于質心的算法通過更新候選質心使其成為給定區域內點的均值候選質心的位置是通過一種稱為“爬山”技術迭代調整的&#xff0c;該技術找到估計的概率密度的局部最大值 1.1 基本形式 給定d維空間的n個數據點集X&#xff0c;那么對于空間中的任意點x的均值漂移…

C#,《小白學程序》第一課:初識程序,變量,數據與顯示

曰&#xff1a;掃地僧練就絕世武功的目的是為了掃地更干凈。 1 引言 編程只是一項技術&#xff0c;如包包子&#xff0c;不是什么高深的科學。 學習程序最不好的方法是先學習枯燥的語法。 學習程序主要是用代碼解決問題。因此&#xff0c;我們拋開所有的語法與諸多廢物&…