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 用户登录验证的小例子
Mar 06 Python
如何解决django配置settings时遇到Could not import settings 'conf.local'
Nov 18 Python
python实现图片处理和特征提取详解
Nov 13 Python
python破解zip加密文件的方法
May 31 Python
Python 生成 -1~1 之间的随机数矩阵方法
Aug 04 Python
Python3.5常见内置方法参数用法实例详解
Apr 29 Python
python实现将文件夹内的每张图片批量分割成多张
Jul 22 Python
Pandas0.25来了千万别错过这10大好用的新功能
Aug 07 Python
python RC4加密操作示例【测试可用】
Sep 26 Python
django formset实现数据表的批量操作的示例代码
Dec 06 Python
浅谈python输出列表元素的所有排列形式
Feb 26 Python
忆童年!用Python实现愤怒的小鸟游戏
Jun 07 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
关于手调机和数调机的选择
2021/03/02 无线电
php生成N个不重复的随机数实例
2013/11/12 PHP
php实现mysql数据库操作类分享
2014/02/14 PHP
PHP获取数组中单列值的方法
2017/06/10 PHP
textContent在Firefox下与innerText等效的属性
2007/05/12 Javascript
用Javascript 获取页面元素的位置的代码
2009/09/25 Javascript
jQuery 处理表单元素的代码
2010/02/15 Javascript
JS生成随机字符串的多种方法
2014/06/10 Javascript
jquery实现两边飘浮可关闭的对联广告
2015/11/27 Javascript
JavaScript中定义类的方式详解
2016/01/07 Javascript
javascript每日必学之封装
2016/02/23 Javascript
jQuery的Each比JS原生for循环性能慢很多的原因
2016/07/05 Javascript
再谈javascript常见错误及解决方法
2016/09/16 Javascript
使用BootStrap实现表格隔行变色及hover变色并在需要时出现滚动条
2017/01/04 Javascript
JS实现微信摇一摇原理解析
2017/07/22 Javascript
在vue项目中正确使用iconfont的方法
2018/09/28 Javascript
redux处理异步action解决方案
2020/03/22 Javascript
javascript-hashchange事件和历史状态管理实例分析
2020/04/18 Javascript
详解JS深拷贝与浅拷贝
2020/08/04 Javascript
浅谈Vue开发人员的7个最好的VSCode扩展
2021/01/20 Vue.js
[01:14:05]《加油DOTA》第四期
2014/08/25 DOTA
python 正则式 概述及常用字符
2009/05/07 Python
python实现无证书加密解密实例
2014/10/27 Python
使用python语言,比较两个字符串是否相同的实例
2018/06/29 Python
python取余运算符知识点详解
2019/06/27 Python
使用keras实现非线性回归(两种加激活函数的方式)
2020/07/05 Python
python中取绝对值简单方法总结
2020/07/24 Python
Python+OpenCV图像处理—— 色彩空间转换
2020/10/22 Python
Ubuntu权限不足无法创建文件夹解决方案
2020/11/14 Python
HTML5 Blob 实现文件下载功能的示例代码
2019/11/29 HTML / CSS
xxx同志考察材料
2014/02/07 职场文书
镇副书记专题民主生活会对照检查材料思想汇报
2014/10/02 职场文书
社区务虚会发言材料
2014/10/20 职场文书
优秀教师推荐材料
2014/12/16 职场文书
公司地址变更通知
2015/04/25 职场文书
工地食品安全责任书
2015/05/09 职场文书