在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 ob2True时才认为它们是相等的。请参阅代码中的do_richcompare() function in object.c;记住代码中的==运算符有比较指针。

09-27 05:37