- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在 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__()
方法。它基于这 4 种方法中的一种提供最多 3 种缺失的特殊方法。
您不能根据仅 __le__
来下订单或 __ge__
因为你不能假设你可以交换 a
和 b
;如果b
是不同的类型 b.__le__
可能没有实现,所以你的 a < b <=> not (b <= a)
map 无法保证。实现使用 (a <= b) and (a != b)
如果__le__
未定义但 __lt__
已经。
完整的映射表是:
a > b
a < b
(not a < b) and (a != b)
a <= b
(not a <= b)
a >= b
(a >= b) and (a != b)
a <= b
a < b
(a < b) or (a == b)
a > b
(not a > b)
a >= b
(not a >= b) or (a == b)
a < b
a <= b
(a <= b) and (a != b)
a > b
(not a > b) and (a != b)
a >= b
(not a >= b)
a >= b
a < b
(not a < b)
a <= b
(not a <= b) or (a == b)
a > b
(a > b) or (a == b)
__eq__
方法是可选的,因为基础 object
object 为你定义了一个;只有当两个实例是同一个对象时,它们才被认为是相等的; ob1 == ob2
仅当ob1 is ob2
是True
.查看 do_richcompare()
function in object.c
;请记住 ==
代码中的运算符有比较指针。
关于 python total_ordering : why __lt__ and __eq__ instead of __le__?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16238322/
下面的代码是我还是python搞混了?我希望 __le__由 a __ge__ unexpectedly called ab __le__ called 我在 python 2.7、3.2 和 p
在 Python3 中,functools.total_ordering decorator允许仅重载 __lt__ 和 __eq__ 以获得所有 6 个比较运算符。 我不明白为什么一个人必须写两个运
我是一名优秀的程序员,十分优秀!