gpt4 book ai didi

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

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

我看到过类似的问题,但是他们没有回答为什么python __lt__的优先级比__gt__高?

快速示例,让我给出一个父类(super class)和一个子类:

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

在父类(super class) 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']

我发现的是:如果__lt__定义在父类(super class)中,那么即使你在子类中定义了__gt__,它仍然会按照父类(super class)中的__lt__方法排序

但如果反过来,在父类(super class)中定义__gt__,在子类中定义__lt__,那么它会在__lt__中排序子类

如果两个方法名称相同(都是 lt 或都是 gt),显然,子类将覆盖父类(super class),这是应该的。

但似乎当它们不同时,它遵循不同的规则:根据 __lt__ 定义的任何内容。我还注意到,即使在一个类中,如果同时定义了 __lt____gt__ (基于不同的东西,它仍然会按 __lt__方法)

回到我的问题,我的观察是否正确?由于我是初学者,而且我还没有通读整个 python 文档,有人可以指出我在文档中的什么地方写了这条规则。

最佳答案

list.sort仅使用 <比较。 This is documented.

二元运算符,如 <将首先尝试左侧操作数的方法,除非右侧操作数的类是左侧操作数类的子类。仅当第一个方法缺失或返回 NotImplemented 时,才会考虑另一个操作数的方法。 . < 的左操作数方法是__lt__ , 右操作数的方法是 __gt__ . This is also documented.

因为你所有的列表元素都有相同的类和__lt__总是成功,只有 __lt__方法最终被调用。

关于python .sort() 对 __lt__ 的优先级高于 __gt__?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48313301/

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