一、 案例說明
本節定義一個小汽車的類Car,類中包括車名carname、百公里油耗oilcostper100km、價格price三個屬性。然后實現
__lt__、__gt__、__le__、__ge__
四個方法(這4個方法的用途請見上一節《第8.21節 Python中__lt__、__gt__等 “富比較”(“rich comparison”)方法用途探究》(https://blog.csdn.net/LaoYuanPython/article/details/95042104),為了說明問題,我們將__lt__與__le__的比較邏輯以及__gt__與__ge__的比較邏輯故意弄成了相反,同時重寫了__repr__方法以輸出格式化的詳細信息。然后我們定義兩個實例變量來進行大小比較,看執行效果。
二、 案例代碼
>>> class Car():
def __init__(self,carname,oilcostper100km, price):
self.carname,self.oilcostper100km,self.price = carname,oilcostper100km, price
def __lt__(self,other):
print("execute __lt__")
return self.price
other.price
def __gt__(self,other):
print("execute __gt__")
return self.oilcostper100km>other.oilcostper100km
def __ge__(self,other):
print("execute __ge__")
return self.oilcostper100km
>> car1,car2 = Car('愛麗舍',8,10),Car('凱美瑞',7,27)
>>> car1
car2,car1>=car2
execute __lt__
execute __le__
execute __gt__
execute __ge__
(True, False, True, False)
>>>
-
通過4個比較的輸出信息可以得知,<、<=、>、>=分別調用了
__lt__、__le__、__gt__、__ge__
四個方法; -
由于
__lt__、__le__
使用price進行比較,且真正的比較表達式是相反的兩個邏輯,所以二者輸出結果也完全相反,同理__gt__、__ge__也是一樣,這說明Python自定義類的實例對象比較大小時,對象的大小判斷規則是由開發者自己定義的,并沒有要求“小于等于”就一定要包含“小于”,二者之間在實現時沒有邏輯關系,__gt__與__ge__也如此,同理__gt__與__lt__也無需是相反的結果,最終的邏輯應該根據業務需要進行重寫確認; - 通過以上案例,我們也知道,通過重寫富比較方法,我們完全可以截獲對象比較邏輯的調用;
- 實際的富比較方法還有__eq__和__ne__,這兩個方法object類實現了,可以直接繼承使用,但也可以重寫。
本節參考資料:
1、《第8.21節 Python中__lt__、__gt__等 “富比較”(“rich comparison”)方法用途探究》;
2、《第8.15節 Python重寫自定義類的__repr__方法》
老猿Python,跟老猿學Python!
博客地址:https://blog.csdn.net/LaoYuanPython
請大家多多支持,點贊、評論和加關注!謝謝!
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
