Python3将类实现比较器的方式从单个__cmp__
函数更改为6 possible functions。我无法将自己的脑袋缠绕在由此产生的几个怪异怪癖上。
例如,参加此类:
from functools import total_ordering
class Class:
def __init__(self, a, b, c):
self.a = a
self.b = b
self.c = c
def __eq__(self, other):
return self.a == other.a and self.b == other.b
@total_ordering
def __lt__(self, other):
return self.c < other.c
这样,您可以轻松地获得两个彼此相等的对象,并且其中一个对象小于另一个对象(例如Class(1,2,3)
和Class(1,2,4)
)。现在,您可以轻松地认为这只是糟糕的设计。您不应该拥有一个使用不同属性的比较器,这很好。但现在考虑一下这个经过稍微修改的类:
from functools import total_ordering
class Class:
def __init__(self, date, name, c):
self.date = date
self.name = name
def __eq__(self, other):
return self.date == other.date and self.name == other.name
@total_ordering
def __lt__(self, other):
return self.date < other.date
此类显然是可订购的(按日期)。但是我也可以有两个彼此不相等但都不小于另一个的对象(例如Class(date(2018,8,14), 'Alice')
和Class(date(2018,8,14), 'Bob')
)。
我想这里有几个问题:
sorted()
或sort()
将如何处理比较不正确的情况?假设,例如,我们创建了一个对象,该对象既小于又大于另一个对象(因为我们很愚蠢)?幕后会发生什么?