【问题标题】: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内置的迭代
  • 谢谢,我觉得你回答得很好。

标签: python oop inheritance


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    • 2020-07-17
    相关资源
    最近更新 更多