最近一个项目,需要实现自定义事件,发现python对于事件好像没有一个非常标准的封装,或者是原语,下面是自己去实现的一个类似事件的方法,逻辑上参考了.net实现事件的方法,也就是特殊的委托。

1. python回调函数

如果对于python回调函数比较熟悉,可以跳过。

讲实话,论坛上基本上说的什么回调函数,只不过是把函数当做参数传递,这种方式也能称之为“回调”函数吗,可能是我浅薄了。。。

def funcA(a, b):return a + bdef funcB(a, b, c, func):return func(a, b) + cif __name__ == '__main__':# 将funcA当做参数,传入funcBres = funcB(1, 2, 3, funcA)print(res)

说一下这个不能称之为回调函数的原因。回调函数应该是指一个函数指针,当我们调用这个函数指针的时候,相当于调用了指针所指向的函数。按上面的示例,一般将funcA称为回调函数,主函数的funcA相当于是函数指针,指向这个回调函数,并将这个“指针”当做参数传给了funcB。这样理解和操作是ok的,但是如果我在调用funcB的时候,并不知道这个指针指向的是哪个回调函数,我只知道这个函数需要的形参和返回值,那该如何操作。如果是c或者c++,可以声明函数指针,然后使用这个函数指针传进去,这个指针指向的是谁可能是由别的函数指定的,那这样的操作python该如何完成。

上面这一大段文字可能理解起来比较绕,没关系,这个和下面的自定义事件逻辑非常像。

2. python自定义事件

事件概述

如果熟悉.NET的话,应该非常清楚事件的机制,我做自定义事件也是参照这一逻辑处理的,可以自行跳过这一小节。

事件的拥有者:事件的发送者

事件的订阅者:事件的接受和处理

事件关系:事件发生后会不会得到响应,得到谁的响应

举个例子:

老师上课点名,点到小明的名字,小明答:到!其他人都没有吱声,其他课堂的人,包括也有一个叫小明的也没有吱声。

上面老师就是事件的拥有者,发出了点名的事件,所有课堂上的同学都订阅了这个事件。这个事件带有一个参数为姓名,姓名的值为小明,于是小明响应这个事件,并喊了一声到!其他课堂的人由于没有订阅这个事件,所以不会动作。

python实现自定义事件

现在有这样一个业务场景。开一个线程循环监视一个变量,当这个变量变化的时候,发出事件,报告这个变量变化了,同时携带一个参数,参数就是这个变量变化的值,之间的监听者响应这个事件。

import time
import threadingtest = 18class MyEvent:onVarChanged = []@staticmethoddef raiseEvent(*args):for fun in MyEvent.onVarChanged:fun(*args)def reportVarChange():currentVar = testwhile True:time.sleep(0.01)if test != currentVar:# test变量发生了改变,激发事假MyEvent.raiseEvent(test)currentVar = testdef ChangeProcessor(newVar):print("changed to:", newVar)if __name__ == '__main__':# 订阅事件,并指定处理函数MyEvent.onVarChanged.append(ChangeProcessor)t = threading.Thread(target=reportVarChange)t.start()time.sleep(1)test = 20time.sleep(1)test = 80time.sleep(1)

熟悉.NET的人对这个框架可能就比较熟悉了,MyEvent类相当于是声明的委托,MyEvent.onVarChanged相当于实现委托的多播。主函数中对onVarChanged列表添加函数指针。当事件发生,MyEvent.raiseEvent函数被调用,所有onVarChanged中函数的指针都被调用。

这样的话,就可以做个EventBase的事件基类,所有自定义事件都继承这个类形成规范。

class EventBase:eventHandler = []@staticmethoddef raiseEvent(obj, *args):for fun in EventBase.eventHandler:fun(obj, *args)

其中raiseEvent参数obj就是发出事件的对象,*args就是事件参数

python实现回调函数,自定义事件相关推荐

  1. java 自定义函数的调用_Java/Android中的函数调用回调函数自定义回调函数

    在做Android自定义控件时遇到要自定义回调函数的问题,想想自己还暂时没有那么精深的技术,赶紧返过头回来再重新研究Java中回调函数的问题.然而不幸的是,网上太多杂乱的帖子和博客都是转来转去,而且都 ...

  2. 回调函数自定义传参_10分钟教你手写8个常用的自定义hooks

    作者言写在文章开头的话 Hook 是 React 16.8 的新增特性.它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性.本文是一篇以实战为主的文章,主要讲解实际 ...

  3. python asyncio回调函数_python回调函数用法实例分析

    python回调函数用法实例分析 本文实例讲述了python回调函数用法.分享给大家供大家参考.具体分析如下: 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用.回调和异步 ...

  4. python asyncio回调函数_Python-asyncio

    1.asyncio 3.4版本加入标准库 asyncio 底层基于selectors 实现,看似库,其实就是一个框架,包含异步IO,事件循环,协程,任务等待等内容. 2.问题引出 defa():for ...

  5. python mount回调函数_为python回调函数设置argtype

    我对Python很在行,所以希望我能正确地表达这个问题.在 整个问题涉及从Python调用C例程.我可以通过把一些相关的问题/答案凑在一起来接近,但我似乎不能把事情安排得很好.有两个方面:第一个是用指 ...

  6. 对于Python中回调函数的理解

    关于回调函数,网上有很多说明和各种解释,多数在尝试用语言描述.我认为,如果对各个角色之间的关系不清楚,如果没有相关的编程需求,那么语言便非常无力,很难理解. 这是360百科的解释: 在计算机程序设计中 ...

  7. python异步回调函数的实现

    2019独角兽企业重金招聘Python工程师标准>>> 说到异步回调函数的应用,最经典的就是ajax. 首先我们回想一下ajax是如何工作的. [javascript] view p ...

  8. python 匿名回调函数_Python面试题之回调函数

    编程分为两类:系统编程(system programming)和应用编程(application programming).所谓系统编程,简单来说,就是编写库:而应用编程就是利用写好的各种库来编写具某 ...

  9. python的回调函数和构造重载

    背景:这个项目遇到的问题是,内部模块发生的事情要在PyQt构建的界面上表现出来,但是内部模块不能调用Qt类的函数,于是要用到回调函数,回调函数可以参数的形式传递给函数,但是我绕了个湾子,被一篇国外的文 ...

最新文章

  1. java OpenCv Mat 类的基本操作(3)
  2. Spring Boot 2.x基础教程:使用EhCache缓存集群
  3. 查找python项目依赖并生成requirements.txt——pipreqs 真是很好用啊
  4. 接口到底是什么(一语道破)
  5. PAT刷题 (Java语言)
  6. 20171117-构建之法:现代软件工程-阅读笔记
  7. 超细节!从源代码剖析Self-Attention知识点
  8. Qt Creator使用3D组件
  9. 5G人才平均月薪水涨船高!通信研发工程师需求最旺
  10. 上怎么图片和字环绕_计算机上的0和1是怎么变成我们屏幕上看到的图片、视频和声音的?...
  11. Android 中文API (37) —— AbsoluteLayout
  12. A股市场周内效应研究
  13. 数据库实验课堂作业-1.1数据定义
  14. postman不跨域 本地开发跨域_为什么postman调接口不会跨域而浏览器会
  15. 1个钟是多久_一个时辰是多久,一个时辰是几个小时?
  16. android win10 投屏,安卓手机投影win10不成功,版本升级前可以
  17. Git 读书笔记(二)
  18. 6_3.信道与信道容量
  19. android recyclerView Binary XML file line #7: Error inflating class android.support.v7.widget.Recycl
  20. 2019年 第11届 全国大学生数学竞赛 初赛(非数学类)试题详细解答

热门文章

  1. 小米集团发布任命文件 小米AIoT战略委员会正式成立
  2. R可视化02|ggplot2-ggplot2快速绘图
  3. 【深度学习学习笔记】4.前馈神经网络之四:卷积神经网络CNN
  4. 核密度估计(Kernel density estimation)
  5. 当客户说要等到促销活动再下单,客服该如何应对?
  6. 电机控制第一天(上):电机基础知识
  7. 团宝网,你的网站升级也太垃圾了
  8. 时间戳服务器作用,叶胜超:一分钟搞懂时间戳和时间戳服务器(21)
  9. php验证iap收据,【iOS-iap防护】验证用户付费收据!拒绝iap Cracker!!
  10. 【材料力学】深度研讨|挠度刚度部分(1)