????我們想讓類支持各種比較操作符渊迁,但是又不想編寫那么多的特殊方法。
????畢竟只定義一個方法不算什么灶挟,但是如果要實現(xiàn)每種可能的比較操作琉朽,那么實現(xiàn)這么多特殊方法就會很快變得繁瑣。
????我們可以使用functools.total_ordering裝飾器來簡化這個過程稚铣。使用它箱叁,可以用來裝飾一個類,然后只要定義eq()方法即支持==操作符的方法以及另一個比較方法(lt()小于操作符惕医,le()小于等于操作符耕漱,gt()大于操作符,ge()大于等于操作符)曹锨。那么裝飾器就可以自動為我們實現(xiàn)其他比較方法孤个。
????下面是使用了該裝飾器的類代碼:
from functools import total_ordering
@total_ordering
class 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()函數(shù)
>>> 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顯然讓這一過程更加簡單椒楣。