python total_ordering:为什么__lt__和__eq__而不是__le__?

时间:2013-04-26 13:57:40

标签: python python-3.x comparison-operators

在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运算符本身不存在吗?

1 个答案:

答案 0 :(得分:16)

文档说明您必须定义__lt__()__le__()__gt__()__ge__()之一,但只有应< / strong>提供__eq__()方法。

换句话说,__eq__方法是可选

total_ordering implementation不要求您指定__eq__方法;它仅测试__lt__()__le__()__gt__()__ge__()方法。它根据其中一个提供了多达3种缺失的特殊方法。

__eq__方法是可选的,因为基础object对象为您定义了一个;只有当两个实例是同一个对象时才被视为相等;仅当ob1 == ob2ob1 is ob2时才True。见do_richcompare() function in object.c;请记住代码中的==运算符是比较指针。