传统方法
自行定义__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
使用标准库下的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