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中合并两个文本文件并按照姓名首字母排序的例子
Apr 25 Python
python logging类库使用例子
Nov 22 Python
Python读取mp3中ID3信息的方法
Mar 05 Python
python下paramiko模块实现ssh连接登录Linux服务器
Jun 03 Python
Python生成器定义与简单用法实例分析
Apr 30 Python
python调用opencv实现猫脸检测功能
Jan 15 Python
python 处理数字,把大于上限的数字置零实现方法
Jan 28 Python
pytorch .detach() .detach_() 和 .data用于切断反向传播的实现
Dec 27 Python
Python面向对象封装操作案例详解 II
Jan 02 Python
Python3的socket使用方法详解
Feb 18 Python
在PyTorch中使用标签平滑正则化的问题
Apr 03 Python
简单介绍Python的第三方库yaml
Jun 18 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程序中的常见漏洞进行攻击(下)
2006/10/09 PHP
建立文件交换功能的脚本(一)
2006/10/09 PHP
用PHP实现多级树型菜单
2006/10/09 PHP
Http 1.1 Etag 与 Last-Modified提高php效率
2008/01/10 PHP
APACHE的AcceptPathInfo指令使用介绍
2013/01/18 PHP
怎样搭建PHP开发环境
2015/07/28 PHP
javascript 写类方式之三
2009/07/05 Javascript
仿猪八戒网左下角的文字滚动效果
2011/10/28 Javascript
解决Jquery load()加载GB2312页面时出现乱码的两种方案
2013/09/10 Javascript
Js操作Select大全(取值、设置选中等等)
2013/10/29 Javascript
探讨js字符串数组拼接的性能问题
2014/10/11 Javascript
js动态切换图片的方法
2015/01/20 Javascript
jquery实现隐藏在左侧的弹性弹出菜单效果
2015/09/18 Javascript
fastclick插件导致日期(input[type="date"])控件无法被触发该如何解决
2015/11/09 Javascript
jquery 校验中国身份证号码实例详解
2017/04/11 jQuery
angular使用bootstrap方法手动启动的实例代码
2017/07/18 Javascript
webpack写jquery插件的环境配置
2017/12/21 jQuery
JS实现关键词高亮显示正则匹配
2018/06/22 Javascript
VUE2.0+ElementUI2.0表格el-table循环动态列渲染的写法详解
2018/11/30 Javascript
详解javascript replace高级用法
2019/02/17 Javascript
vue数据初始化initState的实例详解
2019/04/11 Javascript
完美解决通过IP地址访问VUE项目的问题
2020/07/18 Javascript
React 条件渲染最佳实践小结(7种)
2020/09/27 Javascript
python tensorflow学习之识别单张图片的实现的示例
2018/02/09 Python
python的scikit-learn将特征转成one-hot特征的方法
2018/07/10 Python
Python实现基于POS算法的区块链
2018/08/07 Python
windows下python 3.6.4安装配置图文教程
2018/08/21 Python
opencv resize图片为正方形尺寸的实现方法
2019/12/26 Python
python实现简单猜单词游戏
2020/12/24 Python
CSS3 display知识详解
2015/11/25 HTML / CSS
老师对学生的评语
2014/04/18 职场文书
大学生通用个人自我评价
2014/04/27 职场文书
爱岗敬业事迹材料
2014/12/24 职场文书
党员争先创优承诺书
2015/01/20 职场文书
2015年七一建党节活动方案
2015/05/05 职场文书
浅谈redis整数集为什么不能降级
2021/07/25 Redis