python事件触发机制_python模拟事件触发机制详解
本文实例为大家分享了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模拟事件触发机制详解相关推荐
- python模拟银行存取款_python 模拟银行转账功能过程详解
首先画出流程图,流程图与现实代码有出入,因为刚开始画流程图的时候,有些东西没考虑进去,后来写着写着就慢慢能想起来并实现了. 另有一点经验推荐给新手朋友,如果说碰到一个项目无从下手的话,就先慢慢去写,写 ...
- python协程库_python中协程的详解(附示例)
本篇文章给大家带来的内容是关于python中协程的详解(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 协程,又称微线程,纤程.英文名Coroutine 协程看上去也是子程序 ...
- python函数参数定义_Python函数定义及参数详解
函数定义 首先我们来创建一个函数,输出指定范围内的斐波拉契数列(Fibonacci series). #!/usr/bin/env python #coding=utf-8 ''' Created o ...
- python多进程应用场景_python使用多进程的实例详解
python多线程适合IO密集型场景,而在CPU密集型场景,并不能充分利用多核CPU,而协程本质基于线程,同样不能充分发挥多核的优势. 针对计算密集型场景需要使用多进程,python的multipro ...
- python语言格式化输出_Python format()格式化输出方法详解
原标题:Python format()格式化输出方法详解 format() 方法的语法格式如下: str.format(args) 此方法中,str 用于指定字符串的显示样式:args 用于指定要进行 ...
- python的socket模块_Python socket模块方法实现详解
这篇文章主要介绍了python socket模块方法实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 socket ssh (不带防止粘包的方 ...
- python语法错误概述_Python 错误和异常代码详解
程序中的错误一般被称为 Bug,无可否认,这几乎总是程序员的错... 程序员的一生,始终伴随着一件事 - 调试(错误检测.异常处理).反反复复,最可怕的是:不仅自己的要改,别人的也要改...一万头草泥 ...
- python中字符串乘法_python leetcode 字符串相乘实例详解
给定两个以字符串形式表示的非负整数 num1 和 num2 ,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. 示例 1: 输入: num1 = "2", ...
- python的底层实现_Python底层封装实现方法详解
这篇文章主要介绍了Python底层封装实现方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 事实上,python封装特性的实现纯属" ...
最新文章
- 承担集团数万应用、研发人员日常工作,阿里持续交付平台的设计、迭代之道...
- Android日期对话框NumberPicker的用法教程
- 使用Vysper,TomEE和PrimeFaces将XMPP服务器嵌入JSF Web应用程序内部
- Java Application和Java Applet
- An Overview of Cisco IOS Versions and Naming
- 初识Python正则表达式(9课连发)
- 借势新基建,如何在智能基础设施布一盘大局?
- MDK 中 [WEAK] 的作用
- 2022-2028年中国无线模组行业投资策略探讨及市场规模预测报告
- 全球免费数字图书馆TOP30
- 上海招聘 | 上海人工智能实验室:自动驾驶感知算法研究员、实习生等
- Rundll32.exe 转自5iuu.com
- 计算机辅助电话访问优势,电话访问的优点缺点、优势不足、局限性
- 各种交换机接口及连接方法介绍【详细图文】
- CTF之萌新web学习(命令执行2)
- Linux_查看内存使用情况
- CCF CSP 201803-4 棋局评估
- 【奇奇怪怪的bug】删除文件显示「找不到该项目」怎么办
- C语言生成BMP文件
- Vue 前端数据大屏 适配
热门文章
- hp2548无线服务器地址,无线直连可以这么玩_HP 2548_办公打印应用指南-中关村在线...
- Scrum板与Kanban如何抉择?pqtofaaae板与按照bdyefr
- SpaceVim C++开发环境
- 微信公众号阅读10万+的文章其实充满套路
- 9.4 Python图像处理之图像数学形态学-基于灰度形态学的应用(形态梯度、形态平滑、高帽变换、低帽变换)
- NDK之直播推流-服务器端搭建
- linux给根目录添加卷组,Linux 分区初始化为物理卷,把物理卷加入卷组的方法
- 台式电脑怎么组装步骤_网上千万别买整机,教你如何自己组装台式电脑!
- Linkedin领英怎么导出非好友电话、邮箱等资料
- python爬取二手房库存,存数据库,生成折线图(下)