说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注: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__
更新时间:March 3, 2024, 8:20 p.m. 标签:python 特殊方法 比较