python比較運算符重載_python運算符重載

1、打印操作會首先嘗試__str__和str內置函數,他通常返回一個用戶友好顯示。__repr__用于所有其他環境,用于交互式模式下提示回應以及repr函數,如果沒有使用__str__,則會使用print和str。它通常返回一個編碼字符串,可以用來重新創建對象,或則給開發者一個詳細的顯示。總而言之,除了當定義一個__str__的時候,使用print和str。然而需要注意,如果沒有定義__str__,打印還是使用__repr__,反過來不成立。在交互模式下,只適用__repr__,并且根本不嘗試__str__.

2、__str__,__repr__都必須返回字符串,返回其他類型會抱錯。還有一個需要注意的是,__str__的用戶友好顯示可能只有對象出現在一個打印操作的頂層時候才應用,嵌套 到較大對象中 的對象 可能用其__repr__或默認方法打印。

例如:

class Printer:

def __init__(self,val):

self.val = val

def __str__(self):

return str(self.val)

obj = [Printer(2),Printer(3)]

for x in obj:

print(x) #輸出:2 3

print(obj) #輸出:[<__main__.printer object at>, <__main__.printer object at>]

但是__repr__能夠解決前面提的那個問題

class Printer:

def __init__(self,val):

self.val = val

def __repr__(self):

return str(self.val)

obj = [Printer(2),Printer(3)]

for x in obj:

print(x) #輸出:2 3

print(obj) #輸出:2,3

3、右側加法和原處加法:__radd__,__iadd__

class adder:

def __init__(self,value=0):

self.data = value

def __add__(self,,other):

self.data+=other

adder只是在+左邊是對象時使用,如果要支持右側使用實例對象,則需要重載 __radd__.

例如:

class Commuter:

def __init__(self,val):

self.val = val

def __add__(self,other):

print('add',self.val,other)

return self.val+other

def __radd__(self,other):

print('radd',self.val,other)

return other+self.val #這個 順序無所謂,只是在調用的時候很位置很重要

x = Commuter(88)

y = Commuter(99)

print(x+1)

print('#'*8)

print(1+y)

print('$'*8)

print(x+y)

#輸出結果如下:

add 88 1

89

########

radd 99 1

100

$$$$$$$$

add 88 <__main__.commuter object at>

radd 99 88

187

原處加法: __iadd__或者__add__但是__iadd__更高效

class Number:

def __init__(self,val):

self.val = val

def __iadd__(self,other):

self.val+=other

return self

x = Number(5)

x+=1

x+=1

print(x.val) #輸出:7

或者

class Number:

def __init__(self,val):

self.val = val

def __add__(self,other):

return Number(self.val+other)

4、call表達式:__call__

有關python的__call__在官方文檔上有這么一句解釋 (http://docs.python.org/reference/datamodel.html?highlight=__call__#object.__call__)

object.__call__(self[, args...])

Called when the instance is “called” as a function; if this method is defined, x(arg1, arg2, ...) is a shorthand for x.__call__(arg1, arg2, ...).

當把一個實例當作方法來調用的時候,形如instance(arg1,args2,...),那么實際上調用的就是 instance.__call__(arg1,arg2,...)

例如:

class Prod:

def __init__(self,value):

self.value = value

def __call__(self,other):

return self.value *other

x = Prod(2)

print(x(3)) #輸出:6

5、比較:__lt__,__gt__和其他方法

比較運算沒有位置限制。

比較運算沒有隱士關系,比如說 == 為真并不以為著 !=為假

python2.6中如果沒有定義更為具體的比較方法,對其使用一個__cmp__或者內置cmp函數。

cmp( x, y)

Compare the two objects x and y and return an integer according to the outcome. The return value is negative if x < y, zero if x == y and strictly positive if x > y.

class C:

def __init__(self,data):

self.data = data

def __gt__(self,other):

return self.data > other

def __lt__(self,other):

return self.data < other

x = C('spam')

print('1',x >'ham')

print('2','ham'> x)

print('3',x < 'ham')

print('4','ham'

y = C('ham')

print('5',x

print('6',x>y)

6、布爾測試:__bool__,__len__

在布爾環境中,python首先嘗試__bool__來獲取一個直接布爾值,然后如果沒有該方法,就嘗試__len__類根據對象的長度確定 一個真值。

7、對象析構函數:__del__

每當實例產生時,就會調用__init__構造函數,每當 實例空間被回收時,就會執行析構函數。

class Life:

def __init__(self,name='unknow'):

print('hello ',name)

self.name = name

def __del__(self):

print('Goodbye',self.name)

brain = Life('Brain')#輸出 hello brain

brain = 'loretta' #輸出: Goodbye brain

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

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

相關文章

使用Spring MVC開發Restful Web服務

REST簡介 摘自Wikipedia&#xff1a; REST風格的體系結構由客戶端和服務器組成。 客戶端向服務器發起請求&#xff1b; 服務器處理請求并返回適當的響應。 請求和響應圍繞資源表示的傳遞而構建。 資源本質上可以是可以解決的任何連貫且有意義的概念。 正如您所閱讀的&#xff0…

深入Java核心 Java內存分配原理精講

深入Java核心 Java內存分配原理精講 Java內存分配與管理是Java的核心技術之一&#xff0c;之前我們曾介紹過Java的內存管理與內存泄露以及Java垃圾回收方面的知識&#xff0c;今天我們再次深入Java核心&#xff0c;詳細介紹一下Java在內存分配方面的知識。一般Java在內存分配時…

iOS正則表達式(親測,持續更新)

先來說說判斷方法,書寫不簡介但是好理解: -(BOOL)isRealNmaeString:(NSString *)str{NSString *pattern "填寫正則表達式";NSPredicate *pred [NSPredicate predicateWithFormat:"SELF MATCHES %", pattern];BOOL isMatch [pred evaluateWithObject:str…

python新建一個文件夾需要重新安裝模塊嗎_解決pycharm每次新建項目都要重新安裝一些第三方庫的問題...

目前有三個解決辦法&#xff0c;也是親測有用的&#xff1a;第一個方法&#xff1a;因為之前有通過pycharm的project interpreter里的號添加過一些庫&#xff0c;但添加的庫只是指定的項目用的&#xff0c;如果想要用&#xff0c;就必須用之前的項目的python解釋器&#xff0c;…

端到端測試的濫用–測試技術2

我的上一個博客是有關測試代碼方法的一系列博客中的第一篇&#xff0c;概述了使用一種非常常見的模式從數據庫檢索地址的簡單方案&#xff1a; …并描述了一種非常通用的測試技術&#xff1a; 不編寫測試 &#xff0c; 而是手動進行所有操作。 今天的博客涵蓋了另一種實踐&…

[AlwaysOn Availability Groups]排查:AG超過RPO

[AlwaysOn Availability Groups]排查&#xff1a;AG超過RPO 排查&#xff1a;AG超過RPO 在異步提交的secondary上執行了切換&#xff0c;你可能會發現數據的丟失大于RPO&#xff0c;或者在計算可以忍受的數據都是超過了RPO。 1.通常原因 1.網絡延遲太高&#xff0c;網絡吞吐量太…

那些年困擾我們的Linux 的蠕蟲、病毒和木馬

雖然針對Linux的惡意軟件并不像針對Windows乃至OS X那樣普遍&#xff0c;但是近些年來&#xff0c;Linux面臨的安全威脅卻變得越來越多、越來越嚴重。個中原因包括&#xff0c;手機爆炸性的普及意味著基于Linux的安卓成為惡意黑 客最具吸引力的目標之一&#xff0c;以及使用Lin…

python單元測試框架unittest介紹和使用_Python+Selenium框架設計篇之-簡單介紹unittest單元測試框架...

前面文章已經簡單介紹了一些關于自動化測試框架的介紹&#xff0c;知道了什么是自動化測試框架&#xff0c;主要有哪些特點&#xff0c;基本組成部分等。在繼續介紹框架設計之前&#xff0c;我們先來學習一個工具&#xff0c;叫unittest。unittest是一個單元測試框架&#xff0…

使用PowerMock模擬靜態方法

在最近的博客中&#xff0c;我試圖強調使用依賴注入的好處&#xff0c;并表達一種想法&#xff0c;即這種技術的主要好處之一是&#xff0c;通過在類之間提供高度的隔離&#xff0c;它可以使您更輕松地測試代碼&#xff0c;并且得出的結論是&#xff0c;許多好的測試等于好的代…

多態之向上轉型

//向上轉型&#xff0c;子類引用指向父類對象 public class UpcastingDemo{ public static void main(String[] args){ Employee enew Employee(); System.out.println(e.grade); e.job(); e.run(); System.out.println("\n"); Manager mnew Manager(…

(轉)FPGA異步時序和多時鐘模塊

http://bbs.ednchina.com/BLOG_ARTICLE_3019907.HTM 第六章 時鐘域 有一個有趣的現象&#xff0c;眾多數字設計特別是與FPGA設計相關的教科書都特別強調整個設計最好采用唯一的時鐘域。換句話說&#xff0c;只有一個獨立的網絡可以驅動一個設計中所有觸發器的時鐘端口。雖然…

穆里尼奧:與范加爾風格不同,轉變需要時間

據英媒報道&#xff0c;曼聯主帥穆里尼奧近日向媒體表示自己很難繼續遵循前任主帥范加爾的理念去建立球隊&#xff0c;因為他們兩人有著完全不同的想法。 穆里尼奧近日在接受BT Sport的采訪時表示&#xff1a;“這份工作對于我來說最難的地方便是我與范加爾是非常不同的教練&am…

怎么檢測不到我的音頻_Linux 上的最佳音頻編輯工具推薦 | Linux 中國

在 Linux 上&#xff0c;有很多種音頻編輯器可供你選用。不論你是一個專業的音樂制作人&#xff0c;還是只想學學怎么做出超棒的音樂的愛好者&#xff0c;這些強大的音頻編輯器都是很有用的工具。-- Ankush Das(作者)在 Linux 上&#xff0c;有很多種音頻編輯器可供你選用。不論…

具有GlassFish和一致性的高性能JPA –第3部分

在我的四部分系列的第三部分中&#xff0c;我將解釋將Coherence與EclipseLink和GlassFish結合使用的第二種策略。 這就是通過EclipseLink使用Coherence作為二級緩存&#xff08;L2&#xff09;的全部內容。 一般的做法 這種方法將Coherence數據網格應用于依賴于無法完全預加載到…

接口使用時注意

interface Service{ void doSome(); //方法的默認修飾符為public abstract } public class InterfaceNote implements Service{ //方法默認的修飾符為 default void doSome(){ System.out.println("做一些服務&#xff01;"); } public static void main(String…

【Hexo】deploy出錯的解決方法

1、ERROR Deployer not found: git 執行npm install hexo-deployer-git --save 2、$ hexo d INFO Deploying: git INFO Clearing .deploy_git folder... INFO Copying files from public folder... fatal: Not a git repository (or any of the parent directories): .git F…

精選30道Java筆試題解答(轉)

都是一些非常非常基礎的題&#xff0c;是我最近參加各大IT公司筆試后靠記憶記下來的&#xff0c;經過整理獻給與我一樣參加各大IT校園招聘的同學們&#xff0c;純考Java基礎功底&#xff0c; 老手們就不用進來了&#xff0c;免得笑話我們這些未出校門的孩紙們&#xff0c;但是I…

list取值_Redis中List及quicklist實現-2

上一篇中看了List的使用方式、quicklist中的各個結構體&#xff0c;這一篇來看看quicklist里面的幾個核心函數&#xff0c;quicklistCreate函數、quicklistCreateNode函數、quicklistPush函數、quicklistPop函數。接下來我們通過源碼看一下quicklist中是如何借鑒STL中deque的這…

通過示例休眠–第1部分(刪除孤兒)

所以我想做一系列的冬眠例子&#xff0c;展示冬眠的各種特征。 在第一部分中&#xff0c;我想展示有關刪除孤兒功能及其在故事情節中的使用方法。 因此&#xff0c;讓我們開始:) 先決條件 &#xff1a; 為了嘗試以下示例&#xff0c;您將需要以下提到的JAR文件&#xff1a; …

站長工具--IP地址庫

中國最全的IP地址庫 轉載于:https://www.cnblogs.com/weloveshare/p/5783438.html