python类与对象-如何让类支持比较操作

如何让类支持比较操作

问题举例

有时我们希望自定义类的实例间可以使用<, <=, >, >=, ==, !=符号进行比较,我们自定义比较的行为。

比如,有一个矩形,比较两个矩形的实例时,我们希望比较的是面积。

比如,有一个矩形和一个圆形,我们希望比较一个矩形实例和一个圆形实例,

我们希望它们比较的是面积。

解决思路

(1)比较运算符重载,需要实现以下方法

__lt__, __le__, __gt__, __ge__, __eq__, __ne__

(2)使用标准库functions下的装饰器,total_ordering可以简化此过程。

代码

from functools import total_ordering

from abc import ABCMeta, abstractclassmethod

@total_ordering
class Shape(metaclass=ABCMeta):
    @abstractclassmethod
    def area(self):
        pass

    def __lt__(self, obj):
        print('__lt__', self, obj)
        return self.area() < obj.area()

    def __eq__(self, obj):
        return self.area() == obj.area()

class Rect(Shape):
    def __init__(self, w, h):
        self.w = w
        self.h = h

    def area(self):
        return self.w * self.h

    def __str__(self):
        return 'Rect:(%s, %s)' % (self.w, self.h)

import math
class Circle(Shape):
    def __init__(self, r):
        self.r = r

    def area(self):
        return self.r ** 2 * math.pi


rect1 = Rect(6, 9) # 54
rect2 = Rect(7, 8) # 56
c = Circle(8)

print(rect1 < c)
print(c > rect2)

参考资料:python3实用编程技巧进阶

原文地址:https://www.cnblogs.com/marton/p/10793247.html