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'我不知道为什么这不起作用。
答案 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
的实际实例。由于ContactList
是list
的子类,因此实际上是list
,因此self
可以在for循环中迭代,list
也可以。{ / p>
您可以在翻译中使用help(list)
查看列表方法,也可以阅读Python documentation或tutorial。
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
的子类,因此您也可以在list
,self
上使用__iter__
的每个方法。