python事件驅動模型的代碼
author = 'Administrator'/usr/env/bin python
''' this is document ''' class Event(object): ''' 事件初始化的一個方式 ''' def init(self,event_type,data=None): self._type = event_type self._data = data
@property def type(self): return self._type @property def data(self): return self._data
class EventDispatcher(object): """ event分發類 監聽和分發event事件 """ def init(self):
#初始化事件 self._events = dict() def __del__(self): self._events = None def has_listener(self,event_type,listener): if event_type in self._events.keys(): return listener in self._events[event_type] else: return False def dispatch_event(self,event): """ Dispatch an instance of Event class """ # 分發event到所有關聯的listener if event.type in self._events.keys(): listeners = self._events[event.type] for listener in listeners: listener(event) def add_event_listener(self,event_type,listener): #給某種事件類型添加listner if not self.has_listener(event_type,listener): listeners = self._events.get(event_type,[]) listeners.append(listener) self._events[event_type] = listeners def remove_event_listener(self,event_type,listener): if self.has_listener(event_type,listener): listeners = self._events[event_type] if len(listeners) == 1: del self._events[event_type] else: listeners.remove(listener) self._events[event_type] = listeners
class MyEvent(Event): ASK = "askMyEvent" RESPOND = "respondMyEvent"
class WhoAsk(object): def init(self,event_dispatcher): self.event_dispatcher = event_dispatcher self.event_dispatcher.add_event_listener( MyEvent.RESPOND,self.on_answer_event ) def ask(self): print("who are listener to me?") self.event_dispatcher.dispatch_event(MyEvent(MyEvent.ASK,self))
def on_answer_event(self,event): print("receive event %s",event.data)
class WhoRespond(object): def init(self,event_dispatcher): self.event_dispatcher = event_dispatcher self.event_dispatcher.add_event_listener(MyEvent.ASK,self.on_ask_event)
def on_ask_event(self,event): self.event_dispatcher.dispatch_event(MyEvent(MyEvent.RESPOND,self))
dispatcher = EventDispatcher() who_ask = WhoAsk( dispatcher ) who_responde1 = WhoRespond( dispatcher ) who_responde2 = WhoRespond( dispatcher )
WhoAsk ask
who_ask.ask()</pre>
使用事件驅動的方式寫代碼也不是一天兩天了,今天突然發現這玩意居然有個理論在支撐這個。瞬間感到自己學的都是一點點皮毛而己。
python的事件模型的優勢是,可以直接將某個方法放入事件中,這個好象要比java先進一點。