【问题标题】:What does append(self) mean in Python classes?Python 类中的 append(self) 是什么意思?
【发布时间】:2018-06-29 16:09:34
【问题描述】:

我是 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 指定一个类(对象)的实例,并且附加到一个列表对我来说并非易事。

【问题讨论】:

    标签: python class object self


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      all_contactsContact的类变量,初始化为ContactList的实例,list的子类,所以当通过__init__方法实例化一个新的Contact实例时,@987654327 @ 分配给正在实例化的新实例,self.all_contacts.append(self) 会将新的 Contact 实例添加到 all_contacts 列表中。这样,Contact.all_contacts 将维护所有已实例化的 Contact 实例的列表。

      【讨论】:

        【解决方案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 列表。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-24
          • 1970-01-01
          • 2011-05-11
          • 2015-11-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-29
          相关资源
          最近更新 更多