python模拟事件触发机制详解


Posted in Python onJanuary 19, 2018

本文实例为大家分享了python模拟事件触发机制的具体代码,供大家参考,具体内容如下

EventManager.py

# -*- encoding: UTF-8 -*-

# 系统模块
from queue import Queue, Empty
from threading import *


class EventManager:
  def __init__(self):
    """初始化事件管理器"""
    # 事件对象列表
    self.__eventQueue = Queue()
    # 事件管理器开关
    self.__active = False
    # 事件处理线程
    self.__thread = Thread(target = self.__Run)

    # 这里的__handlers是一个字典,用来保存对应的事件的响应函数
    # 其中每个键对应的值是一个列表,列表中保存了对该事件监听的响应函数,一对多
    self.__handlers = {}  # {事件类型:[处理事件的方法]}

  def __Run(self):
    """引擎运行"""
    while self.__active == True:
      try:
        # 获取事件的阻塞时间设为1秒
        event = self.__eventQueue.get(block = True, timeout = 1) 
        self.__EventProcess(event)
      except Empty:
        pass

  def __EventProcess(self, event):
    """处理事件"""
    # 检查是否存在对该事件进行监听的处理函数
    if event.type_ in self.__handlers:
      # 若存在,则按顺序将事件传递给处理函数执行
      for handler in self.__handlers[event.type_]:
        handler(event)

  def Start(self):
    """启动"""
    # 将事件管理器设为启动
    self.__active = True
    # 启动事件处理线程
    self.__thread.start()

  def Stop(self):
    """停止"""
    # 将事件管理器设为停止
    self.__active = False
    # 等待事件处理线程退出
    self.__thread.join()

  def AddEventListener(self, type_, handler):
    """绑定事件和监听器处理函数"""
    # 尝试获取该事件类型对应的处理函数列表,若无则创建
    try:
      handlerList = self.__handlers[type_]
    except KeyError:
      handlerList = []

    self.__handlers[type_] = handlerList
    # 若要注册的处理器不在该事件的处理器列表中,则注册该事件
    if handler not in handlerList:
      handlerList.append(handler)

  def RemoveEventListener(self, type_, handler):
    """移除监听器的处理函数"""
    #读者自己试着实现

  def SendEvent(self, event):
    """发送事件,向事件队列中存入事件"""
    self.__eventQueue.put(event)

"""事件对象"""
class Event:
  def __init__(self, type_=None):
    self.type_ = type_   # 事件类型
    self.dict = {}     # 字典用于保存具体的事件数据

test.py

# -*- encoding: UTF-8 -*-

from threading import *
from EventManager import *
import time

#事件名称 新文章
EVENT_ARTICAL = "Event_Artical"


#事件源 公众号
class PublicAccounts:
  def __init__(self,eventManager):
    self.__eventManager = eventManager

  def WriteNewArtical(self):
    #事件对象,写了新文章
    event = Event(type_=EVENT_ARTICAL)
    event.dict["artical"] = u'如何写出更优雅的代码\n'
    #发送事件
    self.__eventManager.SendEvent(event)
    print(u'公众号发送新文章')


#监听器 订阅者
class Listener:
  def __init__(self,username):
    self.__username = username

  #监听器的处理函数 读文章
  def ReadArtical(self,event):
    print(u'%s 收到新文章' % self.__username)
    print(u'正在阅读新文章内容:%s' % event.dict["artical"])


"""测试函数"""
def test():
  listner1 = Listener("thinkroom") #订阅者1
  listner2 = Listener("steve")#订阅者2

  eventManager = EventManager()

  #绑定事件和监听器响应函数(新文章)
  eventManager.AddEventListener(EVENT_ARTICAL, listner1.ReadArtical)
  eventManager.AddEventListener(EVENT_ARTICAL, listner2.ReadArtical)
  eventManager.Start()

  publicAcc = PublicAccounts(eventManager)
  while True:
    publicAcc.WriteNewArtical()
    time.sleep(2)

if __name__ == '__main__':
  test()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python提示No module named images的解决方法
Sep 29 Python
python实现在控制台输入密码不显示的方法
Jul 02 Python
Pycharm学习教程(1) 定制外观
May 02 Python
Django实现简单分页功能的方法详解
Dec 05 Python
Flask之请求钩子的实现
Dec 23 Python
解决python3运行selenium下HTMLTestRunner报错的问题
Dec 27 Python
Python实现Linux监控的方法
May 16 Python
详解pyppeteer(python版puppeteer)基本使用
Jun 12 Python
利用Python裁切tiff图像且读取tiff,shp文件的实例
Mar 10 Python
浅谈Django中的QueryDict元素为数组的坑
Mar 31 Python
Python之变量类型和if判断方式
May 05 Python
Matplotlib中%matplotlib inline如何使用
Jul 28 Python
flask使用session保存登录状态及拦截未登录请求代码
Jan 19 #Python
简单谈谈python中的lambda表达式
Jan 19 #Python
python使用logging模块发送邮件代码示例
Jan 18 #Python
zookeeper python接口实例详解
Jan 18 #Python
Python获取当前函数名称方法实例分享
Jan 18 #Python
Python AES加密实例解析
Jan 18 #Python
快速了解python leveldb
Jan 18 #Python
You might like
PHP获取网站域名和地址的代码
2008/08/17 PHP
解析用PHP实现var_export的详细介绍
2013/06/20 PHP
ThinkPHP模板中数组循环实例
2014/10/30 PHP
ThinkPHP提示错误Fatal error: Allowed memory size的解决方法
2015/02/12 PHP
PHP PDOStatement::debugDumpParams讲解
2019/01/30 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
2019/12/18 PHP
PHP与Web页面交互操作实例分析
2020/06/02 PHP
javascript 学习之旅 (1)
2009/02/05 Javascript
使用jQuery向asp.net Mvc传递复杂json数据-ModelBinder篇
2010/05/07 Javascript
javascript代码加载优化方法
2011/01/30 Javascript
关于jQuery对象数据缓存Cache原理以及jQuery.data详解
2013/04/07 Javascript
一张表格告诉你windows.onload()与$(document).ready()的区别
2014/05/16 Javascript
js字符串完全替换函数分享
2014/12/03 Javascript
使用jQuery实现更改默认alert框体
2015/04/13 Javascript
JavaScript实现文本框中默认显示背景图片在获得焦点后消失的方法
2015/07/01 Javascript
Bootstrap的class样式小结
2016/12/01 Javascript
基于JQuery和原生JavaScript实现网页定位导航特效
2017/04/03 jQuery
ECMAscript 变量作用域总结概括
2017/08/18 Javascript
js数组实现权重概率分配
2017/09/12 Javascript
在Swiper内如何制作CSS3动画效果示例代码
2017/12/07 Javascript
Bootstrap4如何定制自己的颜色和风格
2018/02/26 Javascript
JS基于开关思想实现的数组去重功能【案例】
2019/02/18 Javascript
JS数组进阶示例【数组的几种函数用法】
2020/01/16 Javascript
微信小程序动态添加和删除组件的现实
2020/02/28 Javascript
[49:20]VG vs TNC Supermajor小组赛B组败者组决赛 BO3 第二场 6.2
2018/06/03 DOTA
matplotlib绘制符合论文要求的图片实例(必看篇)
2017/06/02 Python
Go/Python/Erlang编程语言对比分析及示例代码
2018/04/23 Python
Python 在字符串中加入变量的实例讲解
2018/05/02 Python
详解python单元测试框架unittest
2018/07/02 Python
HTML5+CSS3 实现灵动的动画 TAB 切换效果(DEMO)
2017/09/15 HTML / CSS
Kate Spade美国官网:纽约新兴时尚品牌,以包包闻名于世
2017/11/09 全球购物
通用自荐信范文
2014/03/14 职场文书
2014党员学习兰辉先进事迹思想汇报
2014/09/17 职场文书
领导干部“四风”问题批评与自我批评材料
2014/09/24 职场文书
幼儿园教师辞职信
2019/06/21 职场文书
html,css,javascript是怎样变成页面的
2023/05/07 HTML / CSS