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