本文实例为大家分享了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模拟事件触发机制详解相关推荐

  1. python模拟银行存取款_python 模拟银行转账功能过程详解

    首先画出流程图,流程图与现实代码有出入,因为刚开始画流程图的时候,有些东西没考虑进去,后来写着写着就慢慢能想起来并实现了. 另有一点经验推荐给新手朋友,如果说碰到一个项目无从下手的话,就先慢慢去写,写 ...

  2. python协程库_python中协程的详解(附示例)

    本篇文章给大家带来的内容是关于python中协程的详解(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 协程,又称微线程,纤程.英文名Coroutine 协程看上去也是子程序 ...

  3. python函数参数定义_Python函数定义及参数详解

    函数定义 首先我们来创建一个函数,输出指定范围内的斐波拉契数列(Fibonacci series). #!/usr/bin/env python #coding=utf-8 ''' Created o ...

  4. python多进程应用场景_python使用多进程的实例详解

    python多线程适合IO密集型场景,而在CPU密集型场景,并不能充分利用多核CPU,而协程本质基于线程,同样不能充分发挥多核的优势. 针对计算密集型场景需要使用多进程,python的multipro ...

  5. python语言格式化输出_Python format()格式化输出方法详解

    原标题:Python format()格式化输出方法详解 format() 方法的语法格式如下: str.format(args) 此方法中,str 用于指定字符串的显示样式:args 用于指定要进行 ...

  6. python的socket模块_Python socket模块方法实现详解

    这篇文章主要介绍了python socket模块方法实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 socket ssh (不带防止粘包的方 ...

  7. python语法错误概述_Python 错误和异常代码详解

    程序中的错误一般被称为 Bug,无可否认,这几乎总是程序员的错... 程序员的一生,始终伴随着一件事 - 调试(错误检测.异常处理).反反复复,最可怕的是:不仅自己的要改,别人的也要改...一万头草泥 ...

  8. python中字符串乘法_python leetcode 字符串相乘实例详解

    给定两个以字符串形式表示的非负整数 num1 和  num2 ,返回  num1 和  num2 的乘积,它们的乘积也表示为字符串形式. 示例 1: 输入: num1 = "2", ...

  9. python的底层实现_Python底层封装实现方法详解

    这篇文章主要介绍了Python底层封装实现方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 事实上,python封装特性的实现纯属" ...

最新文章

  1. 承担集团数万应用、研发人员日常工作,阿里持续交付平台的设计、迭代之道...
  2. Android日期对话框NumberPicker的用法教程
  3. 使用Vysper,TomEE和PrimeFaces将XMPP服务器嵌入JSF Web应用程序内部
  4. Java Application和Java Applet
  5. An Overview of Cisco IOS Versions and Naming
  6. 初识Python正则表达式(9课连发)
  7. 借势新基建,如何在智能基础设施布一盘大局?
  8. MDK 中 [WEAK] 的作用
  9. 2022-2028年中国无线模组行业投资策略探讨及市场规模预测报告
  10. 全球免费数字图书馆TOP30
  11. 上海招聘 | 上海人工智能实验室:自动驾驶感知算法研究员、实习生等
  12. Rundll32.exe 转自5iuu.com
  13. 计算机辅助电话访问优势,电话访问的优点缺点、优势不足、局限性
  14. 各种交换机接口及连接方法介绍【详细图文】
  15. CTF之萌新web学习(命令执行2)
  16. Linux_查看内存使用情况
  17. CCF CSP 201803-4 棋局评估
  18. 【奇奇怪怪的bug】删除文件显示「找不到该项目」怎么办
  19. C语言生成BMP文件
  20. Vue 前端数据大屏 适配

热门文章

  1. hp2548无线服务器地址,无线直连可以这么玩_HP 2548_办公打印应用指南-中关村在线...
  2. Scrum板与Kanban如何抉择?pqtofaaae板与按照bdyefr
  3. SpaceVim C++开发环境
  4. 微信公众号阅读10万+的文章其实充满套路
  5. 9.4 Python图像处理之图像数学形态学-基于灰度形态学的应用(形态梯度、形态平滑、高帽变换、低帽变换)
  6. NDK之直播推流-服务器端搭建
  7. linux给根目录添加卷组,Linux 分区初始化为物理卷,把物理卷加入卷组的方法
  8. 台式电脑怎么组装步骤_网上千万别买整机,教你如何自己组装台式电脑!
  9. Linkedin领英怎么导出非好友电话、邮箱等资料
  10. python爬取二手房库存,存数据库,生成折线图(下)