import datetime
class Person(object):
def __init__(self, name):
self.name = name
self.birthday = None
self.lastname = name.split(' ')[-1]
def getlastname(self):
return self.lastname
def __str__(self):
return self.name
def __lt__(self, other):
''' p1 < p2 is basically p1.__lt__(p2) , where p1 is self and p2 is other'''
if self.lastname == other.lastname:
return self.name < other.name
return self.lastname < other.lastname
def setbday(self, month, day, year):
self.birthday = datetime.date(year, month, day)
def getAge(self):
if self.birthday == None:
raise ValueError
return (datetime.date.today()- self.birthday).days
p1 = Person('Mark Zuckerberg')
p2 = Person('Drew Houston')
p3 = Person('Bill Gates')
p4 = Person('Andrew Gates')
p5 = Person('Steve Wozniak')
personList = [p1, p2, p3, p4, p5]
personList.sort()
for e in personList:
print(e)
Выполнение этого кода дает результат:
Andrew Gates
Bill Gates
Drew Houston
Steve Wozniak
Mark Zuckerberg
Я понимаю, что использование метода sort. () В списке, который содержит экземпляры класса Person, поскольку его элементы вызывают _lt__ (self, other) в классе Person. Но меня смущает то, как этот метод на самом деле сортирует или манипулирует элементами в списке, чтобы имена лексикографически упорядочены в конце программы.
Если я не ошибаюсь, P1 становится self , а P2 становится другим в методе _lt__. В этом случае, поскольку Цукерберг «больше», чем «Хьюстон», мы возвращаем логическое значение «Ложь» ... верно? Если да, то манипулирует ли это списком так, что P2 теперь стоит перед P1, и список трансформируется в [P2, P1, P3, P4, P5]?
Если это так, интуитивно не должно быть блока кода, который реализует манипуляции с элементами в списке, так что если возвращаемое значение метода _lt__ - False, то personList [0] становится personList [1] и наоборот? Я не понимаю, как простой возврат логического значения в методе _lt__ манипулирует списком ....