下面的代码
class point: def __init__(self, x, y): self.x = x self.y = y def dispc(self): return ('(' + str(self.x) + ',' + str(self.y) + ')') def __cmp__(self, other): return ((self.x > other.x) and (self.y > other.y))
在Python 2中可以正常工作,但是在Python 3中我得到一个错误:
>>> p=point(2,3) >>> q=point(3,4) >>> p>q Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unorderable types: point() > point()
它仅适用于==和!=。
==
!=
您需要提供在Python 3订货丰富的比较方法,这是 __lt__,__gt__,__le__,__ge__,__eq__,和__ne__。另请参阅:PEP 207-丰富的比较。
__lt__
__gt__
__le__
__ge__
__eq__
__ne__
__cmp__是 不是 不再使用。
__cmp__
更具体地说,__lt__以self和other作为参数,并且需要返回是否self小于other。例如:
self
other
class Point(object): ... def __lt__(self, other): return ((self.x < other.x) and (self.y < other.y))
(这不是明智的比较实现,但是很难说出您要做什么。)
因此,如果您有以下情况:
p1 = Point(1, 2) p2 = Point(3, 4) p1 < p2
这等效于:
p1.__lt__(p2)
这将返回True。
True
__eq__``True如果点相等False则返回,否则返回。其他方法类似地工作。
__eq__``True
False
如果使用functools.total_ordering装饰器,则只需实现例如__lt__和__eq__方法:
functools.total_ordering
from functools import total_ordering @total_ordering class Point(object): def __lt__(self, other): ... def __eq__(self, other): ...