python事件驅動模型的代碼

jopen 9年前發布 | 1K 次閱讀 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先進一點。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!