讓python類支持比較操作的同時,不必編寫大量的特殊方法
來自專欄進擊的代碼
我們想讓類支持各種比較操作符,但是又不想編寫那麼多的特殊方法。
畢竟只定義一個方法不算什麼,但是如果要實現每種可能的比較操作,那麼實現這麼多特殊方法就會很快變得繁瑣。
我們可以使用functools.total_ordering裝飾器來簡化這個過程。使用它,可以用來裝飾一個類,然後只要定義__eq__()方法即支持==操作符的方法以及另一個比較方法(__lt__()小於操作符,__le__()小於等於操作符,__gt__()大於操作符,__ge__()大於等於操作符)。那麼裝飾器就可以自動為我們實現其他比較方法。 下面是使用了該裝飾器的類代碼:from functools import total_ordering@total_orderingclass person: def __init__(self, name, height): self.name = name self.height = height def __eq__(self, other): return self.height == other.height def __lt__(self, other): return self.height < other.height def __str__(self): return {} is {} cm.format(self.name, self.height)
演示代碼,支持各類的比較操作符,並且支持max()和min()函數
>>> amos = person(Amos, 175)>>> ming = person(ming, 177)>>> lilei = person(lilei, 172)>>> persons = [amos, ming, lilei]>>> print(Is ming as high as lilei?, ming == lilei)Is ming as high as lilei? False>>> print(Is Amos taller or equal to ming?, amos >= ming)Is Amos taller or equal to ming? False>>> print(Who is the tallest one?, max(persons))Who is the tallest one? ming is 177 cm
裝飾器total_ordering從字面上定義了從每個比較方法到其他所有需要該方法的映射關係。自行編寫全部的特殊方法並不難,但是使用了@total_ordering顯然讓這一過程更加簡單。
進擊的代碼公眾號:進擊的代碼Amos
每天更新java、python學習資料、技術乾貨。分享見解,共同進步。
推薦閱讀: