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