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文档,有人可以指出我在这个规则编写的文档中的位置.
list.sort仅使用<比较.这是记录在案的.
二进制运算符<将首先尝试左侧操作数的方法,除非右侧操作数的类是左侧操作数类的子类.只有在第一个方法丢失或返回时才会考虑另一个操作数的方法NotImplemented.左手操作数的方法<是__lt__,而右手操作数的方法是__gt__.这也记录在案.
由于所有列表元素都具有相同的类并且__lt__总是成功,因此只有__lt__方法最终被调用.