Python中可迭代类与迭代器类定义__next__时,__iter__返回self的原因
为什么Python可迭代类的__iter__方法要返回self?
先明确两个核心概念:
- 可迭代对象:实现了
__iter__()方法的对象,这个方法必须返回一个迭代器。 - 迭代器:同时实现
__iter__()和__next__()方法的对象——__next__()负责生成下一个元素,无元素可生成时抛出StopIteration;__iter__()则返回迭代器自身。
你提供的PowTwo类,其实是把可迭代对象和迭代器合二为一了:
- 作为可迭代对象,它的
__iter__()需要返回一个迭代器,这里直接返回self,就是让对象自己充当迭代器。 - 作为迭代器,它靠
__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
相关产品推荐
相关产品推荐

