Что означает добавление (self) в классах Python? - PullRequest
0 голосов
/ 29 июня 2018

Я новичок в ООП в Python и работаю над концепцией наследования. Я наткнулся на следующий код:

class ContactList(list):
    def search(self, name):
        '''Return all contacts that contain the search value in their name.'''
        matching_contacts = []
        for contact in self:
            if name in contact.name:
                matching_contacts.append(contact)
        return matching_contacts

class Contact:
    all_contacts = ContactList()

    def __init__(self, name, email):
        self.name = name
        self.email = email
        self.all_contacts.append(self)

Мне интересно, почему мы используем self.all_contacts.append(self) и как for contact in self работает? Если я правильно понял, self назначает экземпляр класса (объекта), и добавление в список не тривиально для меня.

Ответы [ 3 ]

0 голосов
/ 29 июня 2018

Ну, в основном вы создаете список Contact и добавляете self, добавляете текущий контакт в список all_contacts.

Теперь на ваши вопросы,

Мне интересно, почему мы используем self.all_contacts.append (self)

Мы бы использовали это, потому что all_contacts является переменной класса, что означает, что список будет общим для всех Contact экземпляров.

как for contact in self работает?

Ну, как вы сказали, поскольку self представляет текущий экземпляр, вызов for contact in self позволяет вам выполнять итерацию в текущем списке контактов.

Другими словами, ваш пример кода позволяет вам создать экземпляр Contact, который автоматически добавляется в переменную класса (shared). Теперь, предоставляя класс ContactList, который наследуется от list, они позволяют вам использовать реализованный метод search, который вернет вам другой список Contact на основе вашего поискового фильтра.

0 голосов
/ 29 июня 2018

all_contacts - это переменная класса Contact, инициализированная как экземпляр ContactList, подкласс для list, поэтому, когда создается новый экземпляр Contact с помощью метода __init__, self назначается с созданием нового экземпляра, и self.all_contacts.append(self) добавит новый экземпляр Contact в список all_contacts. Таким образом, Contact.all_contacts будет поддерживать список всех экземпляров Contact, которые были созданы.

0 голосов
/ 29 июня 2018

all_contacts - это переменная класса - она ​​уникальна для класса, а не для каждого экземпляра. Доступ к нему можно получить с помощью Contact.all_contacts. Каждый раз, когда вы создаете новый контакт, он добавляется в этот список всех контактов.

ContactList наследуется от list, поэтому for contact in self работает так же, как и for i in [1,2,3] - он будет перебирать все содержащиеся в нем элементы. Единственное, что он делает иначе, чем list, - это реализует новый метод, search.

...