python .sort()的__lt__优先级高于__gt__?

Cod*_*755 2 python sorting oop python-3.x

我见过类似的问题,但他们没有回答为什么python的__lt__优先级高于__gt__

快速举例,让我给出一个超类和子类:

class Person(object):
    id = 0
    def __init__(self, name):
        self.name = name
        self.id = Person.id
        Person.id += 1

    def __str__(self):
        return self.name

    def __lt__(self, other):
        return self.id < other.id

class SubPerson(Person):
    def __gt__(self, other):
        return self.name > other.name
Run Code Online (Sandbox Code Playgroud)

在超类中Person,我创建了一个__lt__方法,基于Person进行比较self.id.在子类中SubPerson,我创建了一个__gt__基于的比较方法self.name.

我发现如果我SubPerson在列表中创建了许多实例:

s1 = SubPerson('WWW'); s1.id = 14
s2 = SubPerson('XXX'); s2.id = 12
s3 = SubPerson('YYY'); s3.id = 11
s4 = SubPerson('ZZZ'); s4.id = 13
lst2 = [s2, s1, s4, s3]
lst2.sort()
print([i.__str__() for i in lst2])  # >>> ['YYY', 'XXX', 'ZZZ', 'WWW']
Run Code Online (Sandbox Code Playgroud)

我发现:if __lt__是在超类中定义的,那么即使你__gt__在子类中定义,它仍然会按__lt__超类中的方法排序

但是如果它是另一种方式,__gt__在超类和__lt__子类中定义,那么它将__lt__在子类中排序

如果两个方法名称相同(两者lt或两者gt),显然,子类将覆盖超类,因为它应该是.

但似乎当它们不同时,它遵循一个不同的规则:通过任何__lt__定义.我也注意到,即使在一个类中,如果两个__lt____gt__定义(根据不同的东西,它仍然会通过排序__lt__法)

回到我的问题,我的观察是否真实?因为我是初学者,而且我还没有阅读整篇python文档,有人可以指出我在这个规则编写的文档中的位置.

use*_*ica 6

list.sort仅使用<比较.这是记录在案的.

二进制运算符<将首先尝试左侧操作数的方法,除非右侧操作数的类是左侧操作数类的子类.只有在第一个方法丢失或返回时才会考虑另一个操作数的方法NotImplemented.左手操作数的方法<__lt__,而右手操作数的方法是__gt__.这也记录在案.

由于所有列表元素都具有相同的类并且__lt__总是成功,因此只有__lt__方法最终被调用.

  • @Code_Control_jxie0755我认为你关于为什么 __gt__ 起作用的问题在答案本身中得到了回答 - 我也花了一秒钟才理解:“只有第一个方法丢失或返回 NotImplemented 时才会考虑另一个操作数的方法。” 因此,如果 __lt__ 不存在,那么它会反转操作数,并考虑右侧操作数上的 __gt__ 。 (2认同)