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

3

我刚开始学习 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个回答

4

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

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


3

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

现在回答你的问题,

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

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

for contact in self如何工作?

嗯,正如您所说,由于self代表当前实例,调用for contact in self允许您迭代当前联系人列表。

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


3
all_contactsContact 的一个类变量,它是由 ContactList 实例化得到的,ContactListlist 的子类。因此,当通过 __init__ 方法实例化一个新的 Contact 实例时,self 被分配为正在实例化的新实例,并且 self.all_contacts.append(self) 会将新的 Contact 实例添加到 all_contacts 列表中。这样,Contact.all_contacts 将维护一个已实例化的所有 Contact 实例的列表。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接