Python,为啥我们必须从“列表”类继承
Posted
技术标签:
【中文标题】Python,为啥我们必须从“列表”类继承【英文标题】:Python, why do we have to inherit from 'list' classPython,为什么我们必须从“列表”类继承 【发布时间】:2017-09-12 13:49:12 【问题描述】:我正在学习面向对象的 python,遇到了这个问题,python 迫使我从内置的“list”类继承以使用 append 方法。
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)
【问题讨论】:
您希望self
是什么?您的班级是否存储数据?如果有,怎么做?
抱歉,没听懂。我想了解的是,在这两个不同的类中,这两个有什么区别:matching_contact = [] 和 all_contacts = [] 不是都声明一个空列表吗?
问题出在for contact in self:
这行,这需要你编写的类支持迭代。当你从list
继承时,你继承了list
内置的迭代
谢谢,我觉得你回答得很好。
【参考方案1】:
在 ContactSearch 中,matching_contact
是搜索结果的临时变量。 ContactSearch 的一个实例是列表。所以搜索方法可以在迭代器中使用self
。 matching_contact
在搜索方法完成后结束。
在 Contact 中,all_contacts
是类变量,所有 Contact 实例共享它。联系人实例不在列表中。但是您可以使用Contact.all_contacts
之类的方式访问所有联系人,是的,它是列表。
区别仅在于数据的存储位置。一个将数据存储在自身中,另一个将数据存储在其变量中。
【讨论】:
以上是关于Python,为啥我们必须从“列表”类继承的主要内容,如果未能解决你的问题,请参考以下文章
为啥具有私有构造函数的类不阻止从此类继承?如何控制哪些类可以从某个基类继承?