2017-04-16 112 views
0

我正在学习面向对象的python,并遇到这个问题,其中python迫使我从内置的'list'类继承使用append方法。Python,为什么我们必须继承'列表'类

class ContactSearch(list):     #Why inherit from 'list'? 
    def search(self, name): 
     matching_contact = [] 
     for contact in self: 
      if name in contact.name: 
       matching_contact.append(contact) 
     return matching_contact 

为什么我不能简单地声明一个空列表并追加到它?例如,它的工作原理在下面的代码中找到,而不从'列表类的继承:

class Contact: 
    all_contacts = [] 

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

你期望'self'是什么?你的班级是否存储数据?如果是这样,怎么样? –

+0

对不起,我没有得到你。我试图理解的是,在这两个不同的类中,这两者有什么区别: matching_contact = []和 all_contacts = [] 是不是都声明一个空列表? – Hannan

+1

问题是'self for self in line:'这需要您正在编写的类来支持迭代。当你从'list'继承时,你继承了'list'内建的迭代。 –

回答

0

在ContactSearch,matching_contact是搜索结果临时变量。 ContactSearch的一个实例是列表。所以搜索方法可以在迭代器中使用self。当搜索方法完成时,matching_contact结束。

在联系人中,all_contacts是类变量,Contact的所有实例都共享此类。联系人实例不在列表中。但你可以使用像Contact.all_contacts访问所有联系人,是的,它是列表。

区别仅在于数据存储的位置。一个存储数据本身,另一个将数据存储在其变量中。

相关问题