# 如何让类支持比较操作 from functools import total_ordering from abc import ABCMeta, abstractmethod @total_ordering class Shape(object): @abstractmethod def area(self): pass # 小于 def __lt__(self, obj): if not isinstance(obj, Shape): raise TypeError('obj is not shape') return self.area() < obj.area() # 小于等于 # def __le__(self, obj): # return self.area() <= obj.area() # 等于 def __eq__(self, obj): if not isinstance(obj, Shape): raise TypeError('obj is not shape') return self.area() == obj.area() # 大于 def __gt__(self, obj): if not isinstance(obj, Shape): raise TypeError('obj is not shape') return self.area() > obj.area() class Rectangle(Shape): def __init__(self, w, h): self.w = w self.h = h def area(self): return self.w * self.h class Circle(Shape): def __init__(self, r): self.r = r def area(self): return self.r ** 2 * 3.14 r1 = Rectangle(5, 3) r2 = Rectangle(4, 4) c1 = Circle(3) print(r1 <= c1) # r1.__lt__(r2) print(r1 > c1)