python 设计模式 观察者模式(发布订阅模式)
生活随笔
收集整理的這篇文章主要介紹了
python 设计模式 观察者模式(发布订阅模式)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
發布訂閱模式
觀察者模式應用比較廣泛,又被稱為“發布-訂閱”模式。它用來定義對象間一種一對多的依賴關系,當一個對象的狀態發生變化時,所有依賴它的對象都得到通知并被自動更新。
問題1
例子為什么要使用“ @property 與 @*.setter ”裝飾器語法?
出于安全與調用者方便的原因
1.由于為了隱藏發布者消息被篡改,所以設置成立私有屬性__
2.設置私有屬性后,就必須單獨寫一個函數來調用,一個屬性卻需要使用函數的調用方式,會讓調用者迷惑。要使用"@property"裝飾器語法
3.這個屬性,有時會需要調用者重新賦值,要使用"@*.setter"裝飾器語法
以上的內容也是為了演示,在訂閱者名單中,刪除某訂閱者名字后,某訂閱者會不會收到新消息。
from abc import ABCMeta, abstractmethod# 抽象的訂閱者 class Observer(metaclass=ABCMeta):@abstractmethoddef update(self, notice):pass# 抽象的發布者:可以是接口,子類不需要實現,所以不需要定義抽象方法! class Notice:def __init__(self):self.observers = []def attach(self, obs):# 添加 訂閱者名單self.observers.append(obs)def detach(self, obs):# 刪除 訂閱者名單self.observers.remove(obs)def notify(self):# 遍歷訂閱者名單for obs in self.observers:# 使用訂閱者的方法,把發布者作為參數輸入obs.update(self)# 具體的發布者 class StaffNotice(Notice):def __init__(self, company_info):super().__init__() # 調用父類對象聲明observers屬性# 設置了私有屬性self.__company_info = company_info# @property 與 @*.setter 可以配合使用# 既要保護類的封裝特性,又要讓開發者可以使用“對象.屬性”的方式操作操作類屬性,# 通過 @property 裝飾器,可以直接通過方法名來訪問方法,不需要在方法名后添加一對“()”小括號。@propertydef company_info(self):# 直接返回 __company_inforeturn self.__company_info# 兩個同名函數, 當company_info這個"屬性"被賦值時,該函數會被執行 (預處理)@company_info.setterdef company_info(self, info):# 更新 __company_infoself.__company_info = info# 調用發布者的方法self.notify()# 具體的訂閱者 class Staff(Observer):def __init__(self):self.company_info = Nonedef update(self, notice):# 輸入參數.調用發布者的方法 賦值給 訂閱者(自己)self.company_info = notice.company_info# 實例化 發布者 staff_notice = StaffNotice('初始化公司信息')# 實例化 訂閱者 staff1 = Staff() staff2 = Staff()# 添加訂閱 staff_notice.attach(staff1) staff_notice.attach(staff2) # print(staff1.company_info) None # print(staff2.company_info) None# 當company_info這個"屬性"被賦值時, 會觸發"預處理" # 訂閱者 會接收 發布者 的消息 staff_notice.company_info = '假期放假通知!' print(staff1.company_info) print(staff2.company_info)# 刪除 訂閱者 staff2 staff_notice.detach(staff2)# 重新 發布訂閱 staff_notice.company_info = '明天開會!' # staff1 會接收到新的消息 print(staff1.company_info) # staff2 不會接收到新的消息 print(staff2.company_info) """ 假期放假通知! 假期放假通知! 明天開會! 假期放假通知! """總結
以上是生活随笔為你收集整理的python 设计模式 观察者模式(发布订阅模式)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 应用于3D图形制作环境的_JITStac
- 下一篇: websocket python爬虫_p