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

转自:http://my.oschina.net/u/1462124/blog/477693

Python-事件驱动模型代码的更多相关文章

  1. Python自动化之select、greenlet和gevent和事件驱动模型初探

    进程.线程和协程的区别 进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度. 线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度(标准线程是的). 协程和线程一样 ...

  2. Python并发编程-事件驱动模型

     一.事件驱动模型介绍                                                                                         ...

  3. 从spring框架中的事件驱动模型出发,优化实际应用开发代码

    一.事件起源 相信很多人在使用spring框架进行开发时,都会遇到这样的需求:在spring启动后,立即加载部分资源(例如:spring启动后立刻加载资源初始化到redis中).当我去解决这个问题时发 ...

  4. python网络编程--事件驱动模型

    论事件驱动与异步IO 事件驱动模型:根据事件的触发去干什么事,就是根据一个事件做反应 原文:http://www.cnblogs.com/alex3714/articles/5248247.html常 ...

  5. Day14 - Python基础14 事件驱动模型、IO模型

    本节内容: 1:事件驱动模型 2:IO模型前戏准备 3:4种IO模型 1:事件驱动模型 传统的编程是如下线性模式的: 开始--->代码块A--->代码块B--->代码块C---> ...

  6. 35.python之事件驱动模型

    转载:https://www.cnblogs.com/yuanchenqi/articles/5722574.html 事件驱动模型 上节的问题: 协程:遇到IO操作就切换. 但什么时候切回去呢?怎么 ...

  7. python学习之-- 事件驱动模型

    目前主流的网络驱动模型:事件驱动模型 事件驱动模型:也属于生产者/消费者结构,通过一个队列,保存生产者触发的事件,队列另一头是一个循环从队列里不断的提取事件.大致流程如下:1:首先生成一个事件消息队列 ...

  8. python 常忘代码查询 和autohotkey补括号脚本和一些笔记和面试常见问题

    笔试一些注意点: --,23点43 今天做的京东笔试题目: 编程题目一定要先写变量取None的情况.今天就是因为没有写这个边界条件所以程序一直不对.以后要注意!!!!!!!!!!!!!!!!!!!!! ...

  9. (六)观察者模式详解(包含观察者模式JDK的漏洞以及事件驱动模型)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 本章我们讨论一个除前面的单例 ...

  10. 详解Spring事件驱动模型

    转载自:http://jinnianshilongnian.iteye.com/blog/1902886#comments 事件驱动模型简介 事件驱动模型也就是我们常说的观察者,或者发布-订阅模型:理 ...

随机推荐

  1. ios页面间传递参数四种方式

    ios页面间传递参数四种方式 1.使用SharedApplication,定义一个变量来传递. 2.使用文件,或者NSUserdefault来传递 3.通过一个单例的class来传递 4.通过Dele ...

  2. form表单验证2

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. hdu 2030

    PS:原本这道题就空了好久...今天才去查了下汉字机内码... 然后才知道了. 1—— 一个汉字在字符串中是以两个负的字符形式存储,所以本题只要把字符串中负字符的个数找出来,再 除以2 就OK了. 2 ...

  4. Linux内存管理之地址映射

    写在前面:由于地址映射涉及到各种寄存器的设置访问,Linux对于不同体系结构处理器的地址映射采用不同的方法,例如对于i386及后来的32位的Intel的处理器在页式映射时采用的是2级页表映射,而对于I ...

  5. 黑马程序员——【Java基础】——面向对象(一)概述、类与对象、继承、抽象类、接口、多态、内部类

    ---------- android培训.java培训.期待与您交流! ---------- 一.面向对象概述 1.面向对象:是一个很抽象的概念,它相对面向过程而言,是一种程序设计的思想. 2.面向对 ...

  6. BZOJ 3687 简单题

    bitset维护某个和是否存在. bit<<x:所有子集的和+x. #include<iostream> #include<cstdio> #include< ...

  7. C#_控件——CheckBox,TextBox,RequiredFieldValidator

    1. <asp:CheckBox ID="CheckBox2" runat="server" Text="你大爷" AutoPostB ...

  8. 收藏:关于UseSubmitBehavior和OnClientClick同时使用,导致无法触发后台事件的问题

    经常会有正样的需求,在用户做一个不易恢复并且容易误操作的动作时需要给用户以提示,用户确认后继续执行动作. 简单的解决方案是:前台用OnClientClick事件中使用Confirm给用弹出确认提示框, ...

  9. 《JavaScript Ninja》之闭包

    闭包 闭包是什么,它们是如何工作的 闭包 是一个函数在创建时允许该自身函数访问并操作该自身函数之外的变量时所创建的作用域. 即:闭包可以让函数访问所有的变量和函数,只要这些变量和函数存在于该函数声明时 ...

  10. 《JS高程》事件类型学习笔记

    事件类型: UI事件&焦点事件: 鼠标滚轮事件: 键盘与文本事件: 复合事件&变动事件: HTML5事件: 设备事件&触摸与手势事件: