如何迭代一个实例?

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。这是实现事物的方式,因为它只是作为处理循环遍历容器内容的常见情况的一种方式才有意义。别想太多,没必要。