Python 提供“免费的”默认迭代器吗?

5 投票
1 回答
810 浏览
提问于 2025-04-16 23:54

可能重复的问题:
为什么在一个类中定义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__,直到没有更多的值可以取出来为止。

撰写回答