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 【2021.11.10NOIP提高组联考】
简要题解 这套题比较 \(H_2O\) 建议题目背景美文共赏 \(\text{T1}\) 显然一个 \(O(n^3)\) 不能过的 \(dp\) 然而过了?! 用心在该卡时间的地方卡一卡 \(\tex ...
- 代码随想录算法训练营day22 | leetcode 235. 二叉搜索树的最近公共祖先 ● 701.二叉搜索树中的插入操作 ● 450.删除二叉搜索树中的节点
LeetCode 235. 二叉搜索树的最近公共祖先 分析1.0 二叉搜索树根节点元素值大小介于子树之间,所以只要找到第一个介于他俩之间的节点就行 class Solution { public T ...
- css background背景透明
background: transparent; background: rgba(0, 0, 0, 0.8);
- 原创如何给MDK5.37添加Arm Compiler 5
最新发布的MDK5.37已经不再安装Arm Compiler 5(ARMCC)编译器了,因为点击魔术棒后,在Target选项卡中选择编译器时,会看到missing:compiler version 5 ...
- 并发JUC
JUC初级 • 1.什么是 JUC • 2.Lock 接口 • 3.线程间通信 • 4.集合的线程安全 • 5.多线程锁 • 6.Callable 接口 • 7.JUC 三大辅助类: CountDow ...
- [Vs和Reshaper]Vs Studio配合Resharper插件,某些快捷键无法使用的情况,Alt+F7
一直使用Alt+F7来查找变量或者类型的使用位置 家里面的电脑某一天不可以用了,按了没有任何反应 后来查到竟然是被别的软件快捷键覆盖了 Alt+F7是被Nvidia GeForce覆盖了,关掉它或者修 ...
- vscode 中用git命令合并分支
操作:主分支master的代码合并到当前分支wz 操作之前,两个分支的内容都要拉取最新的代码 命令为 git pull origin master git pull origin wz 或者vs内直接 ...
- 微信开发获取code的时候总是提示 10003 redirect_uri域名与后台配置不一致
填写的地址不能加 http://
- php的几种接值方式
1.传单个参数 单个参数这种比较简单,例如 想像edit操作里面传递一个id值,如下写法__URL__/edit/id/1 http://localhost/index.php/user/edit/i ...
- dp-状压dp
https://www.bilibili.com/video/BV1Z4411x7Kw?from=search&seid=13855865082722302053 状压介绍: 状态表示: 转移 ...