python让类支持比较操作

传统方法

自行定义__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

猜你喜欢

转载自blog.csdn.net/weixin_33806914/article/details/87254097
今日推荐