内置类型的继承。作者在哪里获得for循环中的'self'

时间:2015-06-13 14:17:04

标签: python python-3.x inheritance

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']

这是作者写的课程。他创建了一个继承自内置类型List的类。我无法理解for循环。由于作者使用for循环,即'for self in self',导致我认为self = []被声明在某处。作者没有明确地写这个,这使我假设在父类中有一个def init 方法,它提供self = []。我不确定我的理解是否正确,或者我还没有看到其他完全不同的东西。

另外,我不明白作者在if语句中获取contact.name的位置。

修改

我已添加完整代码。我的搜索结果也只生成'John A',还应包括'John B'我不知道为什么这不起作用。

3 个答案:

答案 0 :(得分:1)

在Python中;绑定方法隐式地将实例作为第一个参数传递。按照惯例,我们通常称之为self;但可以成为你想要的任何东西。

所以这里self指的是ContactList的一个实例,它恰好继承自list但它可以继承自其他类型/类self会引用该类实例

示例:

>>> 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)

相反; @classmethod(s)通过&#34;类&#34;作为它的第一个参数,而@staticmethod(s)没有被传递,并且作为常规的非类函数,就好像你在类之外用def定义它们一样。

<强>示例:

>>> 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)

答案 1 :(得分:1)

self指的是ContactList的实际实例。由于ContactListlist的子类,因此实际上是list,因此self可以在for循环中迭代,list也可以。{ / p>

您可以在翻译中使用help(list)查看列表方法,也可以阅读Python documentationtutorial

contact.name来自哪里?在search()方法中,ContactList的每个元素(通过self访问)通过for循环依次绑定到contact,并且此元素包含名为{{的属性1}}。一个例子是一个简单的类name

Contact

请注意class Contact(object): def __init__(self, name, phone=None): self.name = name self.phone = phone >>> contacts = ContactList([Contact('Me','555-1234'), Contact('You','555-4321'), Contact('Someone Else')]) >>> contacts.search('You') [<__main__.Contact object at 0x7f258eab0fd0>] >>> contacts.search('Nobody') [] >>> contacts.search('e') [<__main__.Contact object at 0x7f258eab0f50>, <__main__.Contact object at 0x7f258eabe050>] # 'Me' and "Someone Else' 方法中存在错误(或者在此处发布代码时可能会出现错误?)

search()

位于for循环的主体内,并将在循环的第一次迭代中执行。这意味着搜索将仅检查联系人列表的第一个元素。 return语句应该被解缩到与for循环相同的级别,如下所示:

return matching_contacts

答案 2 :(得分:0)

在方法中,第一个参数(self)始终是实例本身。由于此实例的类是list的子类,因此您也可以在listself上使用__iter__的每个方法。