You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何仅定义__lt__可实现>操作?定义__lt__和__eq__却无法使用<=?

问题解答

为什么仅定义__lt__时,>操作可以正常执行?

Python处理比较运算符时,会自动利用已定义的运算符做反向推导:

  • 执行a > b时,Python先尝试调用a.__gt__(b),如果这个方法不存在,会自动转换为调用b.__lt__(a)(逻辑上a > b等价于b < a)。
  • 因为已经定义了__lt__方法,b.__lt__(a)能正常执行并返回正确结果,所以a > b可以正常运行。

为什么同时定义__lt__和__eq__后,>=操作无法被支持?

Python不会自动通过__lt__和__eq__组合推导出__le__(对应<=)或__ge__(对应>=)方法:

  • 执行a >= b时,Python先尝试调用a.__ge__(b),如果不存在,会转换为调用b.__le__(a)(逻辑上a >= b等价于b <= a)。
  • 但我们没有定义__le__方法,Python也不会自动用b.__lt__(a) or b.__eq__(a)来实现__le__,因此会抛出TypeError,提示不支持<=操作。

解决办法

如果想让所有比较运算符生效,有两种方式:

  1. 手动定义全部需要的比较方法(__lt__、__le__、__gt__、__ge__、__eq__)。
  2. 使用functools.total_ordering装饰器,它会根据已定义的部分比较运算符,自动生成其他所有比较运算符。示例如下:
from functools import total_ordering

@total_ordering
class Node:
    def __init__(self,a,b):
        self._a=a
        self._b=b
    def __lt__(self,other):
        return self._a < other._a
    def __eq__(self,other):
        return self._a == other._a

a=Node(1,2)
b=Node(0,4)
print(a>=b)  # 此时会正常输出True

内容的提问来源于stack exchange,提问作者dollydollydon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 23:06:23