Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 内置类型的继承。作者从何处获得';自我';在for循环中_Python_Python 3.x_Inheritance - Fatal编程技术网

Python 内置类型的继承。作者从何处获得';自我';在for循环中

Python 内置类型的继承。作者从何处获得';自我';在for循环中,python,python-3.x,inheritance,Python,Python 3.x,Inheritance,这是作者写的课程。他创建了一个从内置类型列表继承的类。我很难理解for循环。因为作者使用了for循环,即“for contact in self”,导致我认为self=[]是在某处声明的。作者没有明确地编写这篇文章,这导致我假设父类中有一个definit方法,它提供self=[]。我不确定我的理解是否正确,或者是否有其他我完全看不到的东西 我也不明白作者在if语句中从何处获得contact.name 编辑 我已经添加了完整的代码。我的搜索结果也只生成“johna”,还应该包含“johnb”。我不

这是作者写的课程。他创建了一个从内置类型列表继承的类。我很难理解for循环。因为作者使用了for循环,即“for contact in self”,导致我认为self=[]是在某处声明的。作者没有明确地编写这篇文章,这导致我假设父类中有一个definit方法,它提供self=[]。我不确定我的理解是否正确,或者是否有其他我完全看不到的东西

我也不明白作者在if语句中从何处获得contact.name

编辑


我已经添加了完整的代码。我的搜索结果也只生成“johna”,还应该包含“johnb”。我不知道为什么这不起作用;绑定方法作为第一个参数隐式传递给实例。按照惯例,我们通常称之为“自我”;但它可以是你真正想要的任何东西

因此,
self
这里指的是
ContactList
的一个实例,它恰好继承自
list
(但它可以继承自其他类型/类,
self
将指代该类实例)

示例:

class ContactList(list):

    def search(self, name):
        matching_contacts = []

        for contact in self:
            if name in contact.name:
                matching_contacts.append(contact)
            return matching_contacts

class Contact:
    all_contacts = ContactList()

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

print([c.name for c in Contact.all_contacts.search('John')])
>>> 
['John A']
>>> class Foo(object):
...     def foo(foo, *args):
...             print "Hi I'm {0}! You called me with {1}".format(foo, args)
... 
>>> foo = Foo()
>>> foo.foo(1, 2, 3)
Hi I'm <__main__.Foo object at 0x7fe29f46b750>! You called me with (1, 2, 3)

在方法中,第一个参数(
self
)始终是实例本身。由于这个实例的类是
list
的一个子类,您可以在
self
上使用
list
的每一种方法,
\uuuuuuuuuuuuuuuuuuu

self
指的是
联系人列表的实际实例。由于
联系人列表
列表
的子类,这实际上是一个
列表
,因此
self
可以像
列表
一样在for循环中迭代

您可以在解释器中使用
help(list)
查看列表方法,或者通过阅读或

联系人姓名来自哪里?在
search()
方法中,
ContactList
(通过
self
访问)的每个元素依次被for循环绑定到
contact
,该元素包含一个名为
name
的属性。例如,一个简单的类
Contact

>>> class Foo(object):
...     @classmethod
...     def foo(*args):
...             return args
...     @staticmethod
...     def bar(*args):
...             return args
... 
>>> foo = Foo()
>>> foo.foo(1, 2, 3)
(<class '__main__.Foo'>, 1, 2, 3)
>>> foo.bar(1, 2, 3)
(1, 2, 3)
在for循环体中,将在循环的第一次迭代中执行。这意味着搜索将只检查联系人列表的第一个元素。return语句应该被定义为与for循环相同的级别,如下所示:

return matching_contacts

Yes self是在实例化实例时传入iterable时创建的列表。在代码中,创建实例时传递的某个类的实例中必须有一个iterable实例,该实例具有name属性,但您没有提供该属性。任何列表方法都可用于您创建的任何ContactList实例。如果缺少John B,
search()
方法的return语句嵌套在for循环体中,则for循环只会在一次迭代后终止。您需要删除返回声明-查看下面我的答案以了解详细信息。
return matching_contacts
class ContactList(list):
    def search(self, name):
        matching_contacts = []
        for contact in self:
            if name in contact.name:
                matching_contacts.append(contact)
        return matching_contacts