傳統(tǒng)方法
自行定義__lt__芒填、__le__啤覆、__gt__郑什、__ge__复濒、__eq__
等方法脖卖,比較繁瑣
class Rectangle(object):
def __init__(self, w, h):
self.w = w
self.h = h
def area(self):
return self.w * self.h
def __lt__(self, obj):
print('--lt--')
return self.area() < obj.area()
def __gt__(self, obj):
print('---gt---')
return self.area() >= obj.area()
r1 = Rectangle(3, 5)
r2 = Rectangle(4, 4)
print(r1 < r2) # --lt-- True
print(r1 >= r2) # False
print(r1 <= r2) # True
使用標(biāo)準(zhǔn)庫下的functools下的類裝飾器total_ordering可以簡化此過程
只需要定義__eq__
和其中一個(__lt__、__le__巧颈、__gt__畦木、__ge__
)即可,測試過,此方法也支持不同類之間的比較
from functools import total_ordering
@total_ordering
class Rectangle(object):
def __init__(self, w, h):
self.w = w
self.h = h
def area(self):
return self.w * self.h
def __lt__(self, obj):
print('--lt--')
return self.area() < obj.area()
def __eq__(self, obj):
print('---gt---')
return self.area() == obj.area()
r1 = Rectangle(3, 5)
r2 = Rectangle(4, 4)
print(r1 > r2) # --lt-- False
print(r1 == r2) # ---gt--- False
print(r1 < r2) # --lt-- True
print(r1 >= r2) # --lt-- False