说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gr99123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
在 Python 中,富比较(rich comparison)特殊方法是一组用于实现对象之间比较操作的特殊方法。这些方法使得自定义对象可以支持 <, <=, ==, !=, >=, > 这样的比较操作。
以下是富比较特殊方法及其对应的比较操作:
__lt__(self, other): 实现小于(less than)比较操作(<)。__le__(self, other): 实现小于等于(less than or equal)比较操作(<=)。__eq__(self, other): 实现等于(equal)比较操作(==)。__ne__(self, other): 实现不等于(not equal)比较操作(!=)。__gt__(self, other): 实现大于(greater than)比较操作(>)。__ge__(self, other): 实现大于等于(greater than or equal)比较操作(>=)。这些方法应该返回布尔值(True 或 False),表示对象与另一个对象之间的比较结果。通常情况下,当你定义其中一种比较方法时,其他比较方法会根据其进行推导。但你也可以选择性地实现其中的一部分。
以上这些被称为“富比较”方法。运算符号与方法名称的对应关系如下:
x<y 调用 x.__lt__(y)x<=y 调用 x.__le__(y)x==y 调用 x.__eq__(y)x!=y 调用 x.__ne__(y)x>y 调用 x.__gt__(y)x>=y 调用 x.__ge__(y)如果指定的参数对没有相应的实现,富比较方法可能会返回单例对象 NotImplemented 。按照惯例,成功的比较会返回 False 或 True。不过实际上这些方法可以返回任意值,因此如果比较运算符是要用于布尔值判断(例如作为 if 语句的条件),Python 会对返回值调用 bool() 以确定结果为真还是假。
在默认情况下,object 通过使用 is 来实现 __eq__() ,并在比较结果为假值时返回 NotImplemented : True if x is y else NotImplemented 。 对于 __ne__() ,默认会委托给 __eq__() 并对结果取反,除非结果为 NotImplemented 。 比较运算符之间没有其他隐含关系或默认实现;例如, (x<y or x==y) 为真并不意味着 x<=y 。 要根据单根运算自动生成排序操作,请参看 functools.total_ordering() 。
请查看 __hash__() 的相关知识,了解创建可支持自定义比较运算并可用作字典键的 hashable 对象时要注意的一些事项。
这些方法并没有对调参数版本(在左边参数不支持该操作但右边参数支持时使用);而是 __lt__() 和 __gt__() 互为对方的反射, __le__() 和 __ge__() 互为对方的反射,而 __eq__() 和 __ne__() 则是它们自己的反射。如果两个操作数的类型不同,且右操作数类型是左操作数类型的直接或间接子类,则优先选择右操作数的反射方法,否则优先选择左操作数的方法。虚拟子类不会被考虑。
以下是一个简单的示例,说明了如何实现富比较特殊方法:
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __eq__(self, other):
return self.x == other.x and self.y == other.y
def __lt__(self, other):
return self.x < other.x and self.y < other.y
# 创建两个 Point 对象
p1 = Point(1, 2)
p2 = Point(3, 4)
# 使用富比较进行比较
print(p1 == p2) # 输出:False
print(p1 < p2) # 输出:True
以上我们定义了一个 Point 类,其中实现了 __eq__() 方法和 __lt__() 方法来支持等于和小于比较操作。当我们创建两个 Point 对象 p1 和 p2 并进行比较时,Python 解释器会自动调用这些富比较方法来确定它们之间的关系。
https://docs.python.org/zh-cn/3/reference/datamodel.html#object.__lt__更新时间:2024-03-03 20:20:10 标签:python 特殊方法 比较