You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中可迭代类与迭代器类定义__next__时,__iter__返回self的原因

为什么Python可迭代类的__iter__方法要返回self?

先明确两个核心概念:

  • 可迭代对象:实现了__iter__()方法的对象,这个方法必须返回一个迭代器。
  • 迭代器:同时实现__iter__()和__next__()方法的对象——__next__()负责生成下一个元素,无元素可生成时抛出StopIteration;__iter__()则返回迭代器自身。

你提供的PowTwo类,其实是把可迭代对象和迭代器合二为一了:

  1. 作为可迭代对象,它的__iter__()需要返回一个迭代器,这里直接返回self,就是让对象自己充当迭代器。
  2. 作为迭代器,它靠__next__()生成平方数,同时用self.n维护遍历的位置状态。

回到问题:为什么要返回self?

for循环的执行逻辑很关键:
当你写for i in n:时,Python第一步会调用n.__iter__()拿到迭代器,之后就反复调用这个迭代器的__next__(),直到遇到StopIteration才停止循环。

在这个例子里,我们需要用对象自身的self.n和self.max_pow来控制遍历的进度,所以直接返回self,让对象自己当迭代器,这样遍历过程中能持续更新自身的状态。

反例对比更清楚

如果把__iter__()改成返回新实例:

def __iter__(self):
    return PowTwo(self.max_pow)

那每次遍历n时,都会生成一个全新的PowTwo对象,self.n会重置为0——这意味着你多次遍历n,都会得到相同的输出:0 1 4 9 16 25。但原代码里,遍历一次后self.n已经变成6,再遍历就直接结束,不会有任何输出。

总结

返回self的核心目的是:让当前对象同时承担可迭代对象和迭代器的角色,复用自身的状态完成遍历。这种设计适合一次性迭代的场景——遍历完成后,对象的状态就走到了终点,无法从头再来。如果希望对象能被反复遍历,那__iter__()应该返回一个新的迭代器实例,而不是self。

内容的提问来源于stack exchange,提问作者user29782812

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 23:38:17