Python编程-实现对自定义类对象排序

2023-12-31 16:29:44

Python编程-实现对自定义类对象排序

具有不同标识的类的实例比较结果通常为不相等,除非类定义了 __eq__() 方法。

一个类的实例不能与相同类的其他实例或其他类型的对象进行排序,除非定义该类定义了足够多的方法,包括 __lt__(), __le__(), __gt__() 以及 __ge__() (而如果你想实现常规意义上的比较操作,通常只要有 __lt__()__eq__() 就可以了)。

from:【Python官方文档中文】https://docs.python.org/zh-cn/3/library/stdtypes.html?highlight=sort#comparisons

注意:并不是很推荐看中文,有时候官方翻译也会出歧义,只是这里描述的不错,所以写在了开头

魔术方法

魔法方法运算符行为
__lt__(self, other)<小于运算符的行为
__le__(self, other)<=小于等于运算符的行为
__eq__(self, other)==等于运算符的行为
__ne__(self, other)!=不等于运算符的行为
__gt__(self, other)>大于运算符的行为
__ge__(self, other)>=大于等于运算符的行为

排序示例

定义Person类,并且实现大于,小于,等于魔术方法:

from typing import Self


class Person:
    def __init__(self, name: str, age: int) -> None:
        self.name: str = name
        self.age: int = age

    # 定义小于运算符
    def __lt__(self, other: Self) -> None:
        return self.age < other.age

    # 定义小于等于运算符
    def __le__(self, other: Self) -> None:
        return self.age <= other.age

    # 定义等于运算符
    def __eq__(self, other: Self) -> None:
        return self.age == other.age
    

写一个主程序来运行验证:

if __name__ == "__main__":
    # 创建一些 Person 对象
    person1: Person = Person("Alice", 25)
    person2: Person = Person("Bob", 30)
    person3: Person = Person("Charlie", 20)
    person4: Person = Person("Frank", 20)

    # 使用排序函数对对象列表进行排序
    people: list[Person] = [person1, person2, person3, person4]
    sorted_people: list[Person] = sorted(people)

    # 输出排序结果
    for person in sorted_people:
        print(person.name, person.age, "  ", end='')

得到运行结果:

Charlie 20   Frank 20   Alice 25   Bob 30

其他内容

为了增加输出的人性化提示,我们还可以写一个__repr__方法

__repr__ 是 Python 中一个特殊的魔法方法,用于定义对象的字符串表示形式,我们可以修改我们的程序:

def __repr__(self) -> str:
        return f"The age of {self.name} is {self.age}"
for person in sorted_people:
        print(person)

运行得到:

The age of Charlie is 20
The age of Frank is 20
The age of Alice is 25
The age of Bob is 30

文章来源:https://blog.csdn.net/m0_74220316/article/details/135316948
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。