используя метод sort. () с экземпляром класса, который имеет метод __lt __ (self, other) в качестве атрибута - PullRequest
0 голосов
/ 29 мая 2020
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__ манипулирует списком ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...