您的位置:首页 > 房产 > 建筑 > 企业云_客厅装修效果图片大全_微商推广哪家好_百度关键词排名靠前

企业云_客厅装修效果图片大全_微商推广哪家好_百度关键词排名靠前

2025/5/14 14:13:29 来源:https://blog.csdn.net/huaanxiang/article/details/144050905  浏览:    关键词:企业云_客厅装修效果图片大全_微商推广哪家好_百度关键词排名靠前
企业云_客厅装修效果图片大全_微商推广哪家好_百度关键词排名靠前

Python 中的 Observer(观察者)设计模式 是一种行为型设计模式,用于定义一种订阅机制,让多个观察者对象在某一对象的状态发生变化时自动接收到通知。该模式常用于事件驱动的架构,例如 GUI 系统、消息推送系统等。


Observer 模式的组成

  1. Subject(被观察者)

    • 持有观察者列表,并提供添加、移除观察者的方法。
    • 当状态变化时,通知所有观察者。
  2. Observer(观察者)

    • 定义接口,接收来自 Subject 的更新。
  3. ConcreteSubject 和 ConcreteObserver

    • ConcreteSubject 负责存储具体的状态并通知观察者。
    • ConcreteObserver 实现观察者接口,响应状态变化。

如何在 Python 中实现 Observer 模式

示例:股票价格通知系统
# 观察者接口
class Observer:def update(self, subject):raise NotImplementedError("Subclasses must implement this method.")# 被观察者基类
class Subject:def __init__(self):self._observers = []  # 存储观察者def attach(self, observer):if observer not in self._observers:self._observers.append(observer)def detach(self, observer):self._observers.remove(observer)def notify(self):for observer in self._observers:observer.update(self)# 具体的被观察者
class Stock(Subject):def __init__(self, name, price):super().__init__()self.name = nameself._price = price@propertydef price(self):return self._price@price.setterdef price(self, new_price):if self._price != new_price:self._price = new_priceself.notify()  # 通知观察者价格已变化# 具体的观察者
class Investor(Observer):def __init__(self, name):self.name = namedef update(self, subject):print(f"通知 {self.name}: {subject.name} 的价格已更新为 {subject.price}.")# 使用 Observer 模式
if __name__ == "__main__":# 创建股票对象google_stock = Stock("Google", 1500)# 创建投资者对象investor_a = Investor("Alice")investor_b = Investor("Bob")# 添加观察者google_stock.attach(investor_a)google_stock.attach(investor_b)# 修改价格并触发通知google_stock.price = 1550google_stock.price = 1600# 移除观察者google_stock.detach(investor_a)google_stock.price = 1650
输出结果:
通知 Alice: Google 的价格已更新为 1550.
通知 Bob: Google 的价格已更新为 1550.
通知 Alice: Google 的价格已更新为 1600.
通知 Bob: Google 的价格已更新为 1600.
通知 Bob: Google 的价格已更新为 1650.

使用 Python 内置的 weakref.WeakSet 优化

weakref.WeakSet 可以防止因为观察者未被移除而导致的内存泄漏:

from weakref import WeakSetclass Subject:def __init__(self):self._observers = WeakSet()def attach(self, observer):self._observers.add(observer)def detach(self, observer):self._observers.discard(observer)def notify(self):for observer in self._observers:observer.update(self)

使用 Python 的内置库实现

Python 的 weakrefObservable 可用于更高级的实现,例如通过 abc 模块定义接口或利用事件机制。

使用 Observer Pattern 的替代方案
  • asyncio:实现异步事件通知。
  • pubsub(发布订阅库):如 PyPubSub
  • GUI 框架自带的信号与槽:例如 PyQt。

适用场景

  1. 事件驱动系统:按钮点击事件、输入框监听。
  2. 实时通知系统:新闻订阅、股票更新。
  3. 解耦系统模块:通过观察者减少模块间的直接依赖。

总结

Observer 模式在 Python 中实现起来非常自然,且可以根据实际需求选择基本实现或利用更高级的特性(如弱引用、生成器等)优化。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com