Python 提供“免费的”默认迭代器吗?
可能重复的问题:
为什么在一个类中定义getitem会让它在Python中可迭代?
我有一个类,基本上是用来包装一个Python列表的。在这个类里,我定义了 __getitem__
、__setitem__
和 __len__
。但是我没有为这个类定义 __iter__
。
当我执行:
thing = ListWrapper(range(4))
for i in thing :
print i
我得到了输出:
0
1
2
3
这个结果挺不错的,但我本来以为会出现某种错误信息,告诉我Python找不到迭代器。我查看了文档,没找到关于默认迭代器的任何说明。此外,在PyDev中跟踪代码时发现,它在每次迭代时都在调用 __getitem__
方法。
我在想,依赖这种行为在我的代码中是否是个好习惯。现在我觉得这有点不太对劲。Python是否保证了那些定义了 __getitem__
和 __len__
的类会被当作有定义的迭代器来处理?如果有其他关于可能引发的奇怪问题的信息,也欢迎分享。
1 个回答
4
如果一个类没有 __iter__
这个方法,但有 __getitem__
这个方法,那么在进行循环的时候,系统会用连续的整数去调用 __getitem__
,直到没有更多的值可以取出来为止。