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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容