点击查看代码
"""
案例:展示了迭代器对象和可迭代对象必须分开实现的场景:
- **核心需求**:多个迭代器需要同时独立遍历同一个数据集
- **问题所在**:单一类实现时,所有迭代器共享同一个状态变量,导致进度冲突
- **解决方案**:`NumberCollection`作为可迭代对象负责数据存储,每次调用`__iter__()`都返回新的`NumberIterator`实例
- **实际应用**:在多线程环境、复杂数据处理、需要保存多个迭代快照等场景下,这种分离设计是必要的
通过这种分离设计,每个迭代器都能维护自己的进度状态,实现了真正的独立迭代能力
"""
class NumberIterator:
"""迭代器类 - 每个实例维护独立的迭代状态"""
def __init__(self, numbers):
self.numbers = numbers
self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index >= len(self.numbers):
raise StopIteration
value = self.numbers[self.index]
self.index += 1
return value
class NumberCollection:
"""可迭代对象类 - 数据存储,不维护迭代状态"""
def __init__(self, numbers=None):
self.numbers = numbers if numbers is not None else []
def __iter__(self):
# 每次调用都返回新的迭代器实例
return NumberIterator(self.numbers)
def add_number(self, number):
self.numbers.append(number)
# 使用场景演示
if __name__ == "__main__":
collection = NumberCollection([1, 2, 3, 4, 5])
print("=== 多个独立迭代器同时工作 ===")
# 创建两个独立的迭代器
iterator1 = iter(collection)
iterator2 = iter(collection)
# 两个迭代器独立工作,互不干扰
print(f"迭代器1: {next(iterator1)}") # 1
print(f"迭代器2: {next(iterator2)}") # 1
print(f"迭代器1: {next(iterator1)}") # 2
print(f"迭代器2: {next(iterator2)}") # 2
# 添加新元素后,现有迭代器不受影响
collection.add_number(6)
print(f"迭代器1: {next(iterator1)}") # 3
print(f"迭代器2: {next(iterator2)}") # 3
print("\n=== 与单一类实现的对比 ===")
# 如果使用同一个类实现,会出现状态冲突
class BadDesign:
def __init__(self, numbers):
self.numbers = numbers
self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index >= len(self.numbers):
raise StopIteration
value = self.numbers[self.index]
self.index += 1
return value
bad = BadDesign([1, 2, 3, 4, 5])
bad_iter1 = iter(bad)
bad_iter2 = iter(bad) # 实际上返回的是同一个对象
print(f"坏设计的迭代器1: {next(bad_iter1)}") # 1
print(f"坏设计的迭代器2: {next(bad_iter2)}") # 2 - 状态被共享了!