2017-04-16 110 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訪問所有聯繫人,是的,它是列表。

區別僅在於數據存儲的位置。一個存儲數據本身,另一個將數據存儲在其變量中。

相關問題