如何迭代一个实例?
How can an instance be iterated over?
在datatstructures.py中有一个方法values()
:
def values(self):
"""Iterate over all values."""
for item in self:
yield item[0]
self
是class的一个实例;如何迭代?
很简单,它必须实现__iter__
方法,例如
class Test:
def __iter__(self):
yield 1
yield 2
>>> instance = Test()
>>> for val in instance:
... print val
...
1
2
如果所讨论的对象是 Iterable,则可以对其进行迭代。这就是列表、字典和其他序列的设计方式。
给定方法所属的class扩展了可迭代的ImmutableList
,因此该方法可以在class上迭代。
My question is not How to but rather How can (as in: how can it be possible)
self
指的是你实际处理的有形物体,classes
更像是他们的界面(不要太严格地解释这个);如果实例的 class 定义了 __iter__
(或 __getitem__
)方法,则它们可以在 for
循环中迭代。 PEP 234 处理迭代器的语义和实现。
在你的具体情况下,函数是一个生成器,与__iter__
方法,它只是将values
函数转换为生成器,以支持以下形式的迭代:
for i in instance.values(): # do stuff
如果对象没有定义 __iter__
它将无法迭代,例如:
class myfoo:
def func(self):
for i in range(10): yield i
f = myfoo()
实例f
现在不可迭代:
for i in f: print(i) # TypeError
另一方面,我们可以在 for
循环中使用 func
:
for i in f.func(): print(i, end=" ")
0 1 2 3 4 5 6 7 8 9
将 func
更改为 __iter__
会改变图片,现在实例 f
是 可迭代的:
class myfoo:
def __iter__(self):
for i in range(10): yield i
f = myfoo()
遍历 f
是通过以下方式直观完成的:
for i in f: print(i, end=" ")
0 1 2 3 4 5 6 7 8 9
问为什么,比如,这怎么可能就像问为什么字符串可以乘以 "s" * 4
。这是实现事物的方式,因为它只是作为处理循环遍历容器内容的常见情况的一种方式才有意义。别想太多,没必要。
在datatstructures.py中有一个方法values()
:
def values(self):
"""Iterate over all values."""
for item in self:
yield item[0]
self
是class的一个实例;如何迭代?
很简单,它必须实现__iter__
方法,例如
class Test:
def __iter__(self):
yield 1
yield 2
>>> instance = Test()
>>> for val in instance:
... print val
...
1
2
如果所讨论的对象是 Iterable,则可以对其进行迭代。这就是列表、字典和其他序列的设计方式。
给定方法所属的class扩展了可迭代的ImmutableList
,因此该方法可以在class上迭代。
My question is not How to but rather How can (as in: how can it be possible)
self
指的是你实际处理的有形物体,classes
更像是他们的界面(不要太严格地解释这个);如果实例的 class 定义了 __iter__
(或 __getitem__
)方法,则它们可以在 for
循环中迭代。 PEP 234 处理迭代器的语义和实现。
在你的具体情况下,函数是一个生成器,与__iter__
方法,它只是将values
函数转换为生成器,以支持以下形式的迭代:
for i in instance.values(): # do stuff
如果对象没有定义 __iter__
它将无法迭代,例如:
class myfoo:
def func(self):
for i in range(10): yield i
f = myfoo()
实例f
现在不可迭代:
for i in f: print(i) # TypeError
另一方面,我们可以在 for
循环中使用 func
:
for i in f.func(): print(i, end=" ")
0 1 2 3 4 5 6 7 8 9
将 func
更改为 __iter__
会改变图片,现在实例 f
是 可迭代的:
class myfoo:
def __iter__(self):
for i in range(10): yield i
f = myfoo()
遍历 f
是通过以下方式直观完成的:
for i in f: print(i, end=" ")
0 1 2 3 4 5 6 7 8 9
问为什么,比如,这怎么可能就像问为什么字符串可以乘以 "s" * 4
。这是实现事物的方式,因为它只是作为处理循环遍历容器内容的常见情况的一种方式才有意义。别想太多,没必要。