在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运算符本身不存在吗?
最佳答案
文档说明您必须定义__lt__()
、__le__()
、__gt__()
或__ge__()
中的一个,但只应提供一个__eq__()
方法。
换句话说,__eq__
方法是可选的。total_ordering
implementation不要求您指定__eq__
方法;它只测试__lt__()
、__le__()
、__gt__()
或__ge__()
方法。它提供了多达3种基于这4种方法之一的缺失特殊方法。__eq__
方法是可选的,因为基本的object
对象为您定义了一个实例;只有当两个实例是相同的对象时才认为它们是相等的;ob1 == ob2
只有当ob1 is ob2
是True
时才认为它们是相等的。请参阅代码中的do_richcompare()
function in object.c
;记住代码中的==
运算符有比较指针。