Python total_ordering定义类

  • Post category:Python

Python中的total_ordering装饰器提供了定义类的比较操作的便捷方法,可以自动为类生成等于(equal)、小于(less than)、小于等于(less than or equal)、大于(greater than)和大于等于(greater than or equal)这五个比较操作。

使用total_ordering,需要定义其中至少一个比较操作(ltleeqnegtge)。

下面是total_ordering的使用方法:

首先,需要导入functools模块,使用@total_ordering装饰器装饰类。

from functools import total_ordering

@total_ordering
class MyClass:
    def __init__(self, val):
        self.val = val

    def __eq__(self, other):
        return self.val == other.val

    def __lt__(self, other):
        return self.val < other.val

在上面的示例中,我们使用@total_ordering装饰器装饰了MyClass类,并且定义了__eq__和__lt__两个比较操作方法。这样,类中的其他比较操作会根据这两个方法推导出来。

下面是两个示例说明:

示例一:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    @property
    def age_category(self):
        if self.age < 18:
            return "child"
        elif self.age < 60:
            return "adult"
        else:
            return "senior"

    def __eq__(self, other):
        return self.age == other.age

    def __lt__(self, other):
        return self.age < other.age


p1 = Person("Tom", 18)
p2 = Person("Jack", 20)
p3 = Person("Lucy", 22)

print(p1 == p2)
print(p1 > p3)
print(p3 <= p2)
print(sorted([p1, p2, p3]))

在上面的示例中,我们定义了Person类,并且定义了两个比较操作方法__eq__和__lt__,它们分别用于比较Person对象的年龄,从而可以使用>、>=、==、<=、<运算符进行比较。

运行结果:

False
False
True
[<__main__.Person object at 0x00000229E3094358>, <__main__.Person object at 0x00000229E3094320>, <__main__.Person object at 0x00000229E3094390>]

可以看到,在定义了__eq__和__lt__之后,我们可以直接使用Python中的比较操作符进行比较。

示例二:

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

    def __eq__(self, other):
        return self.width * self.height == other.width * other.height

    def __lt__(self, other):
        return self.width * self.height < other.width * other.height


r1 = Rectangle(3, 4)
r2 = Rectangle(2, 6)
r3 = Rectangle(5, 2)

print(r1 == r2)
print(r2 > r3)
print(r3 >= r1)
print(sorted([r1, r2, r3]))

在上面的示例中,我们定义了Rectangle类,它有两个属性width和height,分别表示矩形的宽和高。我们定义了__eq__和__lt__两个比较操作方法,分别用于比较两个矩形的面积,从而可以使用>、>=、==、<=、<运算符进行比较。

运行结果:

False
False
True
[<__main__.Rectangle object at 0x00000229E3094438>, <__main__.Rectangle object at 0x00000229E3094390>, <__main__.Rectangle object at 0x00000229E3094470>]

可以看到,在定义了__eq__和__lt__之后,我们可以直接使用Python中的比较操作符进行比较。