为什么在类上定义__getitem__会让它变得可迭代?
例如,如果我写道:
class b:
def __getitem__(self, k):
return k
cb = b()
for k in cb:
print k我得到了输出:
0
1
2
3
4
5
6
7
8
...我真的希望看到"for k in cb:“返回一个错误。
发布于 2009-05-29 15:38:10
__getitem__早于迭代器协议,并且在过去是使事物可迭代的唯一方法。因此,它仍然被支持作为一种迭代方法。本质上,迭代的协议是:
__iter__方法。如果存在,请使用新的迭代protocol.__getitem__,直到它引发IndexError。(2)曾经是做这件事的唯一方法,但它的缺点是它假设了比支持迭代所需的更多的东西。为了支持迭代,你必须支持随机访问,这对于像文件或网络流这样的东西来说要昂贵得多,因为向前走很容易,但向后走需要存储所有东西。__iter__允许在没有随机访问的情况下进行迭代,但由于随机访问通常允许迭代,而且打破向后兼容性会很糟糕,因此仍然支持__getitem__。
https://stackoverflow.com/questions/926574
复制相似问题