gpt4 book ai didi

python - 为什么我不能像 Python 2 那样在 Python 3 中使用 __cmp__ 方法?

转载 作者:IT老高 更新时间:2023-10-28 21:44:44 25 4
gpt4 key购买 nike

下面这段代码

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 -- Rich Comparisons .

__cmp__ 不再不再使用。


更具体地说,__lt__selfother为参数,需要返回self是否小于比其他。例如:

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

如果点相等,

__eq__ 将返回 True,否则返回 False。其他方法类似。


如果您使用 functools.total_ordering装饰器,你只需要实现例如__lt____eq__ 方法:

from functools import total_ordering

@total_ordering
class Point(object):
def __lt__(self, other):
...

def __eq__(self, other):
...

关于python - 为什么我不能像 Python 2 那样在 Python 3 中使用 __cmp__ 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8276983/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com