python_如何让类支持比较运算?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python_如何让类支持比较运算?相关的知识,希望对你有一定的参考价值。

案例:

  有时我们希望自定义的类,实例间可以使用比较运算符进行比较,我们自定义比较的行为。

  需求:

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

如何解决这个问题?

  在类中重新定义比较运算符,所有的比较运算可以简化为两个基本的比较运算,小于和等于比较

    单个类比较

#!/usr/bin/python3

from math import pi


class Circle(object):
    def __init__(self, radius):
        self.radius = radius

    def get_area(self):
        return round(pow(self.radius, 2) * pi, 2)

    # 重定义小于比较
    def __lt__(self, other):
        return self.get_area() < other.get_area()

    # 重定义等于比较
    def __eq__(self, other):
        return self.get_area() == other.get_area()

if __name__ == ‘__main__‘:
    c1 = Circle(3.0)
    c2 = Circle(5.0)

    print(c1 < c2)      # c1.__le__(c2)
    print(c1 == c2)     # c1.__eq__(c2)

  

    两个类比较

#!/usr/bin/python3

from math import pi


class Circle(object):
    def __init__(self, radius):
        self.radius = radius

    def get_area(self):
        return round(pow(self.radius, 2) * pi, 2)

    # 重定义小于比较
    def __lt__(self, other):
        return self.get_area() < other.get_area()

    # 重定义等于比较
    def __eq__(self, other):
        return self.get_area() == other.get_area()

if __name__ == ‘__main__‘:
    c1 = Circle(3.0)
    c2 = Circle(5.0)

    print(c1 < c2)      # c1.__le__(c2)
    print(c1 == c2)     # c1.__eq__(c2)


# !/usr/bin/python3

from math import pi


class Circle(object):
    def __init__(self, radius):
        self.radius = radius

    def get_area(self):
        return round(pow(self.radius, 2) * pi, 2)

    # 重定义小于比较
    def __lt__(self, other):
        return self.get_area() < other.get_area()

    # 重定义等于比较
    def __eq__(self, other):
        return self.get_area() == other.get_area()


class Rectangle(object):
    def __init__(self, width, height):
        self.width = width
        self.height = height

    def get_area(self):
        return self.width * self.height

    # 重定义小于比较
    def __lt__(self, other):
        return self.get_area() < other.get_area()

    # 重定义等于比较
    def __eq__(self, other):
        return self.get_area() == other.get_area()


if __name__ == ‘__main__‘:
    c1 = Circle(5.0)
    R1 = Rectangle(4.0, 5.0)

    print(c1 > R1)  # c1.__le__(c2)
    print(c1 == R1)  # c1.__eq__(c2)

  

  会出现一个问题,重复代码,如何解决?

    通过functools下类的装饰器total_ordering进行比较

# !/usr/bin/python3

from math import pi
from abc import abstractmethod
from functools import total_ordering


@total_ordering
class Shape(object):
    """
    定义一个抽象类,重定义比较运算,再定义抽象方法,然后子类通过这个方法进行比较,
    其他子类比较类都需要重构抽象方法,实现比较运算
    """
    
    # 标记比较方法,抽象方法
    @abstractmethod
    def get_area(self):
        pass
    
    # 重定义小于比较
    def __lt__(self, other):
        return self.get_area() < other.get_area()
    
    # 重定义等于比较
    def __eq__(self, other):
        return self.get_area() == other.get_area()


class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius
    
    def get_area(self):
        return round(pow(self.radius, 2) * pi, 2)
    

class Rectangle(Shape):
    def __init__(self, width, height):
        self.width = width
        self.height = height
    
    def get_area(self):
        return self.width * self.height


if __name__ == ‘__main__‘:
    c1 = Circle(5.0)
    R1 = Rectangle(4.0, 5.0)
    
    print(c1 > R1)  # c1.__le__(c2)
    print(c1 == R1)  # c1.__eq__(c2)

 

  

 

  

以上是关于python_如何让类支持比较运算?的主要内容,如果未能解决你的问题,请参考以下文章

7-5 如何让类支持比较操作

如何在 python 中并行化以下代码片段?

使类支持比较操作

Python面向对象运算符重载

Python如何将'int'与'float'对象进行比较?

7Python全栈之路系列之面向对象运算符重载