在python类中定义生成器方法需将__iter__实现为含yield的生成器函数,每次调用返回独立generator对象,支持多次迭代;避免返回self或手动维护状态,可灵活访问实例属性和方法,但需注意惰性执行与数据结构修改风险。

在 Python 类中定义生成器方法,是让类实例支持 for 循环、list()、next() 等迭代操作的常用方式。核心在于实现 __iter__ 方法并让它返回一个生成器(即包含 yield 的函数),从而自动满足迭代协议。
让 __iter__ 返回生成器函数
最直接的方式是把 __iter__ 本身写成生成器方法:用 yield 逐个产出数据,Python 会自动将其编译为返回 generator 对象的方法。
- 不需要手动实现
__next__或维护状态变量 - 每次调用
iter(obj)都会新建一个独立的生成器,支持多次迭代 - 适合数据可一次性计算或按需生成的场景(如遍历内部列表、递归结构、范围模拟)
避免在 __iter__ 中返回自身
不要写 return self 并试图在类里同时实现 __next__ 来复用实例——这会让对象变成单次迭代器,无法重复使用,且容易因状态残留出错。
- 例如,若在
__next__中用self.index计数,第二次for循环会从上次结束位置继续,而非重头开始 - 生成器天然无状态(每次调用
__iter__都新建协程帧),更安全、更符合直觉
配合其他方法灵活控制迭代逻辑
生成器方法可以调用实例属性、其他方法,甚至嵌套循环或条件判断,逻辑清晰易读。
- 可访问
self.data、self.children等属性,做过滤(if x > 0: yield x)、转换(yield x * 2)、展开(yield from self.subitems) - 适合树形结构的深度优先/广度优先遍历、带格式处理的字段输出等场景
注意生成器的惰性与生命周期
生成器只在迭代时执行,不提前计算全部结果;一旦耗尽,再次迭代会立即结束(空序列)。
- 若需缓存结果供多次使用,应在生成器外显式转为
list或用属性缓存 - 避免在生成器中修改正在遍历的底层数据结构(如边遍历边
del列表元素),可能引发RuntimeError或跳过元素











