| 注册
请输入搜索内容

热门搜索

Java Linux MySQL PHP JavaScript Hibernate jQuery Nginx
jopen
10年前发布

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()

使用事件驱动的方式写代码也不是一天两天了,今天突然发现这玩意居然有个理论在支撑这个。瞬间感到自己学的都是一点点皮毛而己。

python的事件模型的优势是,可以直接将某个方法放入事件中,这个好象要比java先进一点。