gpt4 book ai didi

python - 要使自定义类的对象具有可比性,仅定义 `__eq__` 和 `__lt__` 系列中的几个成员就足够了吗?

转载 作者:行者123 更新时间:2023-11-28 21:35:40 24 4
gpt4 key购买 nike

假设我有一个类,我想将其成员与常用运算符进行比较 == , < , <= , > , 和 >= .

据我所知,这可以通过初始化定义魔术方法来完成 __cmp__(a, b)返回 -1 ( a < b )、0 ( a == b ) 或 1 ( a > b )。

好像__cmp__ was deprecated since Python 3赞成定义 __eq__ , __lt__ , __le__ , __gt__ , 和 _ge__方法分开。

我定义了 __eq____lt__假设 __le__ 的默认值看起来像 return a == b or a < b .以下类似乎不是这种情况:

class PQItem:
def __init__(self, priority, item):
self.priority = priority
self.item = item

def __eq__(self, other):
return isinstance(other, PQItem) and self.priority == other.priority

def __lt__(self, other):
return isinstance(other, PQItem) and self.priority < other.priority

class NotComparable:
pass

x = NotComparable()
y = NotComparable()
# x < y gives error

我得到了这个结果:

>>> PQItem(1, x) == PQItem(1, y)
True
>>> PQItem(1, x) < PQItem(1, y)
False
>>> PQItem(1, x) <= PQItem(1, y)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unorderable types: PQItem() <= PQItem()

这让我得出结论,我必须手动定义所有比较魔术方法才能使类具有可比性。有没有更好的办法?

为什么有 __cmp__被弃用了吗?这似乎是一种更好的处理方式

最佳答案

对于两个对象 ab , __cmp__需要 其中之一 a < b , a == b , 和 a > b是真的。但情况可能并非如此:考虑集合,其中没有一个是真的很常见,例如{1, 2, 3}对比{4, 5, 6} .

所以 __lt__并介绍了喜欢的东西。但这给 Python 留下了两个独立的排序机制,这有点荒谬,因此在 Python 3 中删除了不太灵活的一个。

您实际上不必实现所有六种比较方法。您可以使用 functools.total_ordering 类装饰器来帮助定义其余的魔法比较方法:

from functools import total_ordering
@total_ordering
class PQItem:
def __init__(self, priority, item):
self.priority = priority
self.item = item

def __eq__(self, other):
return isinstance(other, PQItem) and self.priority == other.priority

def __lt__(self, other):
return isinstance(other, PQItem) and self.priority < other.priority

关于python - 要使自定义类的对象具有可比性,仅定义 `__eq__` 和 `__lt__` 系列中的几个成员就足够了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52027891/

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