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

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










