Python 要使自定义类的对象具有可比性,仅定义`\uu eq\uuu`和`\uu lt\uuuu`族中的几个成员就足够了吗?

Python 要使自定义类的对象具有可比性,仅定义`\uu eq\uuu`和`\uu lt\uuuu`族中的几个成员就足够了吗?,python,python-3.x,magic-methods,Python,Python 3.x,Magic Methods,假设我有一个类,我想将它的成员与常用的操作符进行比较 据我所知,这可以通过初始化defining magic method\uu cmp\uu(a,b)来实现,该方法返回-1(ab) 似乎\uu cmp\uuuuu倾向于分别定义\uuuu eq\uuuu、\uu lt\uuuuuu、\uu le\uuuuuu、和\uge\uuuuu方法 我定义了\uuuu eq\uuuu和\uu lt\uuuu,假设\uuu le\uuuuu的默认值类似于返回a==b或aPQItem(1,x)>>pq项(1,x

假设我有一个类,我想将它的成员与常用的操作符进行比较

据我所知,这可以通过初始化defining magic method
\uu cmp\uu(a,b)
来实现,该方法返回-1(
a
)、0(
a==b
)或1(
a>b

似乎
\uu cmp\uuuuu
倾向于分别定义
\uuuu eq\uuuu
\uu lt\uuuuuu
\uu le\uuuuuu
、和
\uge\uuuuu
方法

我定义了
\uuuu eq\uuuu
\uu lt\uuuu
,假设
\uuu le\uuuuu
的默认值类似于
返回a==b或a
。以下类别似乎并非如此:

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
类PQ项:
定义初始(自身、优先级、项目):
self.priority=优先级
self.item=项目
定义(自身、其他):
返回isinstance(其他,PQItem)和self.priority==其他.priority
定义(自身、其他):
返回isinstance(其他,PQItem)和self.priority
我得到的结果是:

>>> 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()
PQItem(1,x)=PQItem(1,y) 真的 >>>PQItem(1,x)>>>pq项(1,x)对于两个对象
a
b
要求
a
a==b
a>b
中的一个为真。但可能不是这样的:考虑集合,在这些集合中,没有一个是真的,例如“代码> { 1, 2, 3 } /代码> VS <代码> { 4, 5, 6 } < /代码> .< 因此,引入了
\uult\uuuu
等。但是这使得Python有了两个独立的排序机制,这有点荒谬,因此在Python3中删除了不太灵活的机制

实际上,您不必实现所有六种比较方法。您可以使用类装饰器来帮助定义其他神奇的比较方法:

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
从functools导入总排序
@总订单
类别项目:
定义初始(自身、优先级、项目):
self.priority=优先级
self.item=项目
定义(自身、其他):
返回isinstance(其他,PQItem)和self.priority==其他.priority
定义(自身、其他):
返回isinstance(其他,PQItem)和self.priority