默认的__iter__函数是什么?

8 浏览
0 Comments

默认的__iter__函数是什么?

为什么在一个类上定义__getitem__会使其可迭代?

例如,如果我这样写:

class B:
    def __getitem__(self, k):
        return k
cb = B()
for k in cb:
    print k

我会得到以下输出:

0
1
2
3
4
5
...

我真的期望看到for k in cb:返回一个错误。

0
0 Comments

在Python中,有两种方法可以使对象可以进行迭代:使用__iter__方法和__getitem__方法。然而,在迭代协议出现之前,__getitem__是唯一一种实现迭代的方法。

迭代协议的规则如下:

1. 首先,检查对象是否有__iter__方法。如果存在,使用新的迭代协议。

2. 如果对象没有__iter__方法,就会尝试使用__getitem__方法,并依次传入越来越大的整数值,直到抛出IndexError异常为止。

然而,__getitem__方法有一个缺点,即它假设需要支持随机访问。这对于像文件或网络流这样的对象来说,支持向前访问很容易,但向后访问则需要存储所有内容,代价很高。因此,__iter__方法的出现弥补了这个缺点,它允许迭代而不需要随机访问。尽管如此,由于随机访问通常也可以实现迭代,而且为了保持向后兼容性,Python仍然支持__getitem__方法。

因此,__iter__方法的默认实现是为了支持迭代协议,以及为了保持向后兼容性。这样一来,即使有更好的方法来实现迭代,Python仍然保留了__getitem__方法。

总结起来,__iter__方法的出现是为了解决__getitem__方法在支持迭代时所带来的额外开销,同时保持向后兼容性。如果要实现迭代功能,推荐使用__iter__方法。

0