我对使用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
会指定一个类(对象)的实例,并且追加到列表对我而言并不重要。
答案 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_contacts
是Contact
的类变量,初始化为ContactList
的实例,list
的子类,因此当新的Contact
实例为通过__init__
方法实例化的实例,为self
分配了实例化的新实例,并且self.all_contacts.append(self)
会将新的Contact
实例添加到all_contacts
列表中。这样,Contact.all_contacts
将维护所有已实例化的Contact
实例的列表。