python 的钩子函数
一、什么是钩子函数
hook函数就是在一定条件下才会执行的函数,将自己实现的函数挂载到挂载点上
1. hook函数:就是我们自己实现的函数,函数类型与挂载点匹配(返回值,参数列表)
2. 挂接:也就是hook或者叫注册(register),使得hook函数对目标可用
3. 目标挂载点:也就是挂我们hook函数的地方(我们想在这个目标点实现我们自己的功能
二、使用场景
一般在流程性的代码中会使用hook函数,挂载点可能会执行我们实现的函数,也可能不执行,当满足一定条件才会执行的情况下
import time class LazyPerson(object):
def __init__(self, name):
self.name = name
self.watch_tv_func = None # 目标挂载点
self.have_dinner_func = None def get_up(self):
print("%s get up at:%s" % (self.name, time.time())) def go_to_sleep(self):
print("%s go to sleep at:%s" % (self.name, time.time())) def register_tv_hook(self, watch_tv_func): # 挂接
self.watch_tv_func = watch_tv_func def register_dinner_hook(self, have_dinner_func):
self.have_dinner_func = have_dinner_func def enjoy_a_lazy_day(self):
self.get_up()
time.sleep(2)
# watch tv --> check the watch_tv_func(hooked or unhooked) --> hooked
if self.watch_tv_func is not None:
self.watch_tv_func(self.name)
else: # unhooked
print("no tv to watch") time.sleep(2)
# have dinner --> check the have_dinner_func(hooked or unhooked) --> hooked
if self.have_dinner_func is not None:
self.have_dinner_func(self.name)
else: # unhooked
print("nothing to eat at dinner") time.sleep(2)
self.go_to_sleep() def watch_daydayup(name): # hook函数
print("%s : The program ---day day up--- is funny!!!" % name) def watch_happyfamily(name):
print("%s : The program ---happy family--- is boring!!!" % name) def eat_meat(name):
print("%s : The meat is nice!!!" % name) def eat_hamburger(name):
print("%s : The hamburger is not so bad!!!" % name) def test():
lazy_tom = LazyPerson("Tom")
lazy_jerry = LazyPerson("Jerry") # register hook
lazy_tom.register_tv_hook(watch_daydayup)
lazy_tom.register_dinner_hook(eat_meat) lazy_jerry.register_tv_hook(watch_happyfamily)
lazy_jerry.register_dinner_hook(eat_hamburger) # enjoy a day
lazy_tom.enjoy_a_lazy_day()
lazy_jerry.enjoy_a_lazy_day() test()
钩子函数的实现就是通过一定的关系,将两个函数产生关联,例如上面的例子,register_tv_hook函数和watch_day_day_up通过self.watch_tv_func产生关联,如果要执行watch_tv_func函数,需要先进行注册(register_tv_hook),然后判断注册时传入的self.watch_tv_func是否为空,如果为空则表示注册未成功,则不执行我们自己写的函数watch_tv_func,如果不为空,则表示注册成功,则执行函数watch_day_day_up,大大扩展了类的可执行方法
参考文档:https://www.cnblogs.com/zhang-ye/p/16289417.html 、https://blog.csdn.net/RayMand168/article/details/128560646
python 的钩子函数的更多相关文章
- python 钩子函数
python 在windows下监听键盘按键 使用到的库 ctypes(通过ctypes来调用Win32API, 主要就是调用钩子函数) 使用的Win32API SetWindowsHookEx(), ...
- 让你轻松掌握 Python 中的 Hook 钩子函数
1. 什么是Hook 经常会听到钩子函数(hook function)这个概念,最近在看目标检测开源框架mmdetection,里面也出现大量Hook的编程方式,那到底什么是hook?hook的作用是 ...
- 【Flask】 python学习第一章 - 4.0 钩子函数和装饰器路由实现 session-cookie 请求上下文
钩子函数和装饰器路由实现 before_request 每次请求都会触发 before_first_requrest 第一次请求前触发 after_request 请求后触发 并返回参数 tear ...
- Python 钩子函数详解
###### 钩子函数 ``` import pluggy hookspec = pluggy.HookspecMarker('aaa') hookimpl = pluggy.HookimplMark ...
- VueRouter和Vue生命周期(钩子函数)
一.vue-router路由 1.介绍 vue-router是Vue的路由系统,用于定位资源的,在页面不刷新的情况下切换页面内容.类似于a标签,实际上在页面上展示出来的也是a标签,是锚点.router ...
- Django forms组件与钩子函数
目录 一.多对多的三种创建方式 1. 全自动 2. 纯手撸(了解) 3. 半自动(强烈推荐) 二.forms组件 1. 如何使用forms组件 2. 使用forms组件校验数据 3. 使用forms组 ...
- ajax提交文件,django测试脚本环境书写,froms组件,钩子函数
1.在新版本中,添加app是直接在settings设置中,将INSTALLED_APPS里添加app名字, 但是他的完整写法是 'app01.apps.App01Config' 因为新版本做了优 ...
- [Django REST framework - 序列化组件、source、钩子函数]
[Django REST framework - 序列化组件.source.钩子函数] 序列化器-Serializer 什么是rest_framework序列化? 在写前后端不分离的项目时: 我们有f ...
- Pytest_Hook钩子函数总结(14)
前言 pytest 的钩子函数有很多,通过钩子函数的学习可以了解到pytest在执行用例的每个阶段做什么事情,也方便后续对pytest二次开发学习.详细文档可以查看pytest官方文档https:// ...
- Forms组件与钩子函数
目录 一:Forms组件 1.案例需求: 2.前端 3.后端 二:form表单前后端动态交互 1.form组件 2.为什么数据效验非要去后端 不能在前端利用js直接完成呢? 3.举例:购物网站 三:基 ...
随机推荐
- JZOJ 4299. 【NOIP2015模拟11.2晚】舳舻牌
题目 思路 倒序 \(DP\) 设 \(f_{i,j}\) 表示 \(A\) 先手,当前 \(A\) 报出的值为 \(i\),\(B\) 报出的值为 \(j\),\(A\) 取诱惑值大于等于 \(i\ ...
- .net 移动mas短信接口开发
接口文档下载 1.移动后台接入用户新增(选择HTTP协议) 2.后台代码 /// <summary> /// 用户名 /// </summary> priva ...
- Map Inference in the Face of Noise and Disparity代码环境搭建
1. 引言 地图生成算法网站Mapconstruction by pfoser里可以看到许多关于地图生成算法的介绍,Map Inference in the Face of Noise and Dis ...
- 第五周作业-N67044-张铭扬
1. 搭建chrony服务完成多个主机的时间同步. [root@centos8 ~]# yum -y install chrony [root@centos8 ~]# vim /etc/chrony ...
- 第六周作业-N67044-张铭扬
1. 简述DDL,DML,DCL,DQL,并且说明mysql各个关键字查询时候的先后顺序 DDL:Data Defination Language 数据定义语言,主要是建表.删除表.修改表字段等操作 ...
- mybatis日志打印到控制台
mybatis: configuration:# 日志输出到控制台 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
- C++数组(二):二维数组
二维数组 什么是二维数组?二维数组就是在一维数组的基础上增加一个维度. 二维数组的定义方式 数据类型 数组名[行数][列数]; int arr[2][3]; arr[0][0] = 1; arr[0] ...
- QML笔记——MouseArea的覆盖区域
问题摘要: 初学QML,今天发现一个奇怪的现象,调用MouseArea的位置不同,结果不同. 1.一个简单的qml示例 Rectangle { id: root width: 320 height: ...
- laravel-hash表的简单使用
- redis的安装详细教程
redis官方下载地址是:https://redis.io/download, redis 64位下载地址是:https://github.com/ServiceStack/redis-windows ...