对,如果只是问「迭代器」本身,那答案是:是的,必须 return self。
Python 的数据模型文档里写得非常明确:
iterator.__iter__()
Return the iterator object itself.
所以只要一个类想充当「迭代器」,它的 __iter__ 方法就该简单地
def __iter__(self):
return self
这是协议的一部分,不遵守就不再是规范的迭代器
在 Python 里「迭代器」≠「可迭代对象」:
1. 可迭代对象(Iterable)
必须实现 __iter__,而且只能返回一个新的或复用的迭代器。
它通常不返回 self,因为可迭代对象本身不一定是迭代器。
2. 迭代器(Iterator)
必须实现 __iter__ 和 __next__。
它的 __iter__ 才规定为 return self——这是为了让 iter(iterator) 仍然拿到自身,从而能继续被 for 循环等场合反复使用。
# 1. 可迭代对象(不是迭代器) class Range7: def __init__(self, n): self.n = n def __iter__(self): # 返回一个全新的迭代器实例,绝不返回 self return Range7Iterator(self.n) # 2. 真正的迭代器 class Range7Iterator: def __init__(self, n): self.n = n self.i = 0 def __iter__(self): # 这里才必须 return self return self def __next__(self): if self.i >= self.n: raise StopIteration v = self.i self.i += 1 return v