python迭代器本身不可观察,但可封装为简易可观察数据源:通过类包装迭代器、维护观察者列表、在__next__中触发回调,并区分数据就绪与迭代结束事件。

迭代器本身不直接支持“观察”或响应式更新,它只是按需产生数据的一次性序列。所谓“可观察数据源”,通常指能主动通知订阅者数据变化的对象(如 RxPy、Observable 模式),而标准 Python 迭代器是被动、单向、无状态监听能力的。但你可以用迭代器作为底层数据供给层,再叠加观察逻辑来构建简易可观察数据源。
迭代器作为数据生产者
迭代器天然适合做“源头”——它不预先加载全部数据,适合流式、延迟生成的场景(如日志行读取、传感器采样、数据库游标)。关键在于:把迭代器封装成可被多个消费者感知变化的结构。
- 每次调用 next() 获取新值时,可触发通知逻辑(比如广播给注册的回调)
- 迭代器自身不保存观察者,需额外维护一个观察者列表
- 需区分“数据就绪”和“迭代结束”两种事件(StopIteration 不应被当作错误,而是正常终止信号)
手动实现简易 Observable 迭代器
不依赖第三方库,可用类包装迭代器并支持注册回调:
- 定义一个 ObservableIterator 类,内部持有一个真实迭代器(如
iter(range(5))) - 提供 subscribe(callback) 方法添加监听函数
- 重写 __next__():取出值后遍历所有回调并传入该值
- 遇到 StopIteration 时,可统一触发
on_completed回调(若支持)
与生成器结合提升灵活性
用 yield 写的生成器函数本身就是迭代器,且更易嵌入逻辑:
- 在
yield前插入通知调用,例如:self._notify(value) - 支持动态注入新数据(如通过队列或线程往生成器内部推送值)
- 配合 async def 可做成异步可观察源(如监听 WebSocket 消息流)
实际使用注意点
纯迭代器无法回溯或重复消费,因此“可观察”不等于“可重放”。若需多订阅者各自独立消费,应为每个观察者创建独立迭代器副本(调用 iter() 重新获取);否则共享同一个迭代器会导致相互干扰。
真正成熟的可观察数据源(如 RxPy 的 Observable.from_iterable())会在迭代器基础上补全调度、错误传播、生命周期管理等能力。Python 原生迭代器只提供最基础的数据流骨架,观察行为需额外设计。











