- __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先进一点。
来源: http://www.phpxs.com/code/1004946/