突然,在想為什麼兩個物件可以比較大小呢?比如類的兩個例項,這就不得不說python3中的富比較方法了。
拿python3中的functools中的cmp_to_key函式作為例子。下面是該函式的源**:
def
cmp_to_key
(mycmp)
:"""convert a cmp= function into a key= function"""
classk(
object):
__slots__ =
['obj'
]def
__init__
(self, obj)
: self.obj = obj
def__lt__
(self, other)
:return mycmp(self.obj, other.obj)
<
0def
__gt__
(self, other)
:return mycmp(self.obj, other.obj)
>
0def
__eq__
(self, other)
:return mycmp(self.obj, other.obj)==0
def__le__
(self, other)
:return mycmp(self.obj, other.obj)
<=
0def
__ge__
(self, other)
:return mycmp(self.obj, other.obj)
>=
0 __hash__ =
none
return k
該函式內部定義了乙個類,該類有5個方法,分別是__lt__, __gt__,__eq__,__le__,__ge__
其實還可以定義__ne__
方法。
這分別對應了:小於,大於,等於,小於等於,大於等於,不等於。這六個就是富比較方法。
物件之所以能夠比較大小,就是因為這六個富比較方法在其作用。例如,__lt__富比較方法可以直接對映到對應的操作符如「<」,操作更方便簡潔。
舉個例子來講吧:
#@author: sjl
#@creaetd: 2019/09/23
#@updated: 2019/09/23
#@desc: 實驗python中的富比較方法,__lt__, __gt__, __le__, __ge__, __eq__, __ne__這6個富比較方法
class
test
(object):
def__init__
(self, value)
: self.value = value
def__lt__
(self, other)
:print
('呼叫test的__lt__方法'
)return self.value < other.value
def__gt__
(self, other)
:print
('呼叫test的__gt__方法'
)return self.value > other.value
t1 = test(1)
t2 = test(2)
print
(t1 > t2)
print
(t2 < t1)
# 當比較兩個例項t1和t2的大小時,實際就是呼叫了對應的富比較方法。
# 例子中時t1 > t2,應該對映到了test_1類中的__gt__方法,也就是比較了這兩個例項的value屬性的大小。
輸出結果如下:
呼叫test的__gt__方法
false
呼叫test的__lt__方法
false
將**修改之後:
class
test
(object):
def__init__
(self, value)
: self.value = value
def__lt__
(self, other)
:print
('呼叫test的__lt__方法'
)return self.value < other.value
def__gt__
(self, other)
:print
('呼叫test的__gt__方法'
)return self.value*
10> other.value
t1 = test(1)
t2 = test(2)
print
(t1 > t2)
print
(t2 < t1)
輸出結果如下:
呼叫test的__gt__方法
true
呼叫test的__lt__方法
false
[1] python的富比較方法__eq__和__ne__之間的關聯關係分析
[2] 為什麼python中稱__lt__、__gt__等為「富比較」方法
Python的富比較方法
python的富比較方法 python的富比較方法包括 lt gt le ge eq 和 ne 六個方法,分別表示 小於 大於 小於等於 大於等於 等於和不等於,對應的操作運算子為 和 那麼是否象普通數字運算一樣,這些符號之間存在關聯關係呢?如 小於等於 是否就包含了 小於 比較符號之間有必須的包含...
Python的富比較方法 lt gt
python的富比較方法包括 lt gt 分別表示 小於 大於,對應的操作運算子為 那麼是否象普通數字運算一樣,這兩個方法之間存在互反的關係呢?python沒有對 lt gt 這兩個方法之間有什麼強制關係,但建議 lt 和 gt 為互反,開發者完全可以根據業務邏輯的需要自己定義。我們來進行分析驗證 ...
Python的富比較方法 le ge
python的富比較方法包括 le ge 分別表示 小於等於 大於等於,對應的操作運算子為 那麼是否象普通數字運算一樣,這兩個方法之間存在互反的關係呢?python沒有對 le ge 這兩個方法之間有什麼強制關係,但建議 le 和 ge 為互反,開發者完全可以根據業務邏輯的需要自己定義。我們來進行分...