# 如何让类支持比较操作
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)