观察者模式是“一对多”依赖关系,被观察者状态改变时自动通知所有观察者;python中可用函数引用和列表实现基础订阅系统,weakref可避免内存泄漏,生产环境推荐blinker等轻量库。

观察者模式的核心逻辑
观察者模式本质是“一对多”的依赖关系:当一个对象(被观察者)状态改变,所有依赖它的对象(观察者)自动收到通知并更新。Python中不依赖接口或抽象类也能实现,靠函数引用、列表存储和简单调用就能完成事件订阅与分发。
手动实现基础版订阅系统
不需要第三方库,几行代码就能搭出可工作的事件机制:
- 被观察者维护一个观察者列表(如 list 或 set),支持添加(subscribe)和移除(unsubscribe)
- 定义一个 notify 方法,遍历列表并调用每个观察者的回调函数
- 观察者可以是普通函数、绑定方法,甚至 Lambda 表达式
- 状态变更时主动调用 notify,不依赖轮询或定时器
用 weakref 避免内存泄漏
直接存函数或实例方法引用会导致对象无法被垃圾回收。尤其在 GUI 或长期运行服务中,容易积累僵尸观察者:
- 改用 weakref.WeakSet 存储观察者,自动清理已销毁的对象
- 对普通函数可用 weakref.ref 包装,调用前检查是否仍有效
- 避免在类内部用 self.method 直接注册——它会强持有实例
借助 signal 或 events 库简化开发
生产项目推荐轻量第三方方案,减少重复造轮子:
立即学习“Python免费学习笔记(深入)”;