具有不同标识的类的实例比较结果通常为不相等,除非类定义了
__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