在Python3中,functools.total_ordering decorator只允许重载__lt__
和__eq__
来获取所有6个比较运算符。
我不明白为什么一个人必须写一个足够的运算符,即__le__
或__ge__
,所有其他运算符都会相应地定义:
a < b <=> not (b <= a)
a > b <=> not (a <= b)
a == b <=> (a <= b) and (b <= a)
a != b <=> (a <= b) xor (b <= a)
这只是因为xor运算符本身不存在吗?
答案 0 :(得分:16)
文档说明您必须定义__lt__()
,__le__()
,__gt__()
或__ge__()
之一,但只有应< / strong>提供__eq__()
方法。
换句话说,__eq__
方法是可选。
total_ordering
implementation不要求您指定__eq__
方法;它仅测试__lt__()
,__le__()
,__gt__()
或__ge__()
方法。它根据其中一个提供了多达3种缺失的特殊方法。
__eq__
方法是可选的,因为基础object
对象为您定义了一个;只有当两个实例是同一个对象时才被视为相等;仅当ob1 == ob2
为ob1 is ob2
时才True
。见do_richcompare()
function in object.c
;请记住代码中的==
运算符是比较指针。