为什么仅定义 __lt__ 就可以进行 > 操作?

dol*_*don 3 python class operator-keyword gt

class Node:
    def __init__(self,a,b):
        self._a=a
        self._b=b
    def __lt__(self,other):
        return self._a<other._a


a=Node(1,2)
b=Node(0,4)
print(a>b)
Run Code Online (Sandbox Code Playgroud)

上面的代码显示 True。

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)
Run Code Online (Sandbox Code Playgroud)

上面的代码显示了 TypeError: 'Node' 和 'Node.js 实例之间不支持'<='。

为什么仅定义lt就可以进行 >(即gt)操作?为什么同时定义lteq会使 <= 不可能?

iBu*_*Bug 5

Python文档规定:

\n
\n

这些方法没有交换参数版本(当左参数不支持该操作但右参数支持该操作时使用);相反,__lt__()__gt__()是彼此\xe2\x80\x99s 的反射,__le__()__ge__()是彼此\xe2\x80\x99s 的反射,并且__eq__()__ne__()它们自己的反射。

\n
\n

因此,如果左侧参数未实现比较运算符,而右侧参数实现其反射,则会调用该反射。这也解释了为什么 Python 不将__lt__()和合并__eq__()__le__()\xe2\x80\x94 中,它根本不被考虑。

\n