在Python类中append(self)是什么意思?

时间:2018-06-29 16:09:35

标签: python class object self

我对使用Python进行OOP并不陌生,并且致力于继承概念。我遇到以下代码:

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 :(得分:4)

all_contacts是一个类变量-它是类唯一的,而不是每个实例唯一的。可以使用Contact.all_contacts进行访问。每当您创建新联系人时,该联系人都会被添加到所有联系人的列表中。

ContactList继承自list,因此for contact in self的工作方式与for i in [1,2,3]相同-它将遍历它包含的所有项目。与list唯一不同的地方是实现了一种新方法search

答案 1 :(得分:3)

好吧,基本上,您将创建一个Contact列表,并附加self将当前联系人添加到all_contacts列表中。

现在您的问题,

  

我想知道为什么我们使用self.all_contacts.append(self)

我们将使用它,因为all_contacts是一个类变量,这意味着该列表将在所有Contact实例之间共享。

  

for contact in self如何工作?

好吧,正如您所说,由于self代表当前实例,因此调用for contact in self可以使您在当前联系人列表中进行迭代。

换句话说,您的代码示例使您可以创建Contact实例,该实例将自动附加到类变量(共享)中。现在,通过提供一个继承自ContactList的{​​{1}}类,它们使您可以使用已实现的list方法,该方法将根据您的搜索过滤器返回另一个search的列表

答案 2 :(得分:3)

all_contactsContact的类变量,初始化为ContactList的实例,list的子类,因此当新的Contact实例为通过__init__方法实例化的实例,为self分配了实例化的新实例,并且self.all_contacts.append(self)会将新的Contact实例添加到all_contacts列表中。这样,Contact.all_contacts将维护所有已实例化的Contact实例的列表。