为何仅定义__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,提示不支持<=操作。
解决办法
如果想让所有比较运算符生效,有两种方式:
- 手动定义全部需要的比较方法(
__lt__、__le__、__gt__、__ge__、__eq__)。 - 使用
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
相关产品推荐
相关产品推荐

