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 的一个实例是列表。所以搜索方法可以在迭代器中使用selfmatching_contact在搜索方法完成后结束。

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

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

【讨论】:

以上是关于Python,为啥我们必须从“列表”类继承的主要内容,如果未能解决你的问题,请参考以下文章

Python继承扩展内置类

为啥具有私有构造函数的类不阻止从此类继承?如何控制哪些类可以从某个基类继承?

Python - 从旧式类继承

为啥我们不能在不从 NSObject 继承类的情况下迅速采用协议?

C++ 继承&多态

为啥继承另一个类的类不会产生与“另一个类”相同的结果?