首页 > 编程语言 >python 的钩子函数

python 的钩子函数

时间:2023-02-02 09:57:44浏览次数:56  
标签:函数 hook python 钩子 self watch tv func name

一、什么是钩子函数

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

标签:函数,hook,python,钩子,self,watch,tv,func,name
From: https://www.cnblogs.com/renjie1105/p/17084962.html

相关文章

  • JavaScript 中URL构造函数
    前言URL对于我们开发人员来讲,应该是非常熟悉了。在对URL进行参数拼接时,我们一般都会直接进行字符串拼接或使用模版字符串,因为这样非常方便,但是我们这样其实会在不知不觉......
  • robotframe work中 自定义python library使用global variable
    在用robotframework的小伙伴,有没有遇到这样一个问题:  当你用python写一个libary时, 需要用到robotframe外面定义的globalvariable. 怎么处理?  这时一般人的做......
  • Python 异步集群使用
    目前在做Python项目用到同步和异步的方法使用Redis单机,现在要增加兼容Redis集群。也就说当前项目用到中以下4种Python使用Redis的方法都用到了。-同步异步单机......
  • 读Java8函数式编程笔记08_测试、调试和重构
    1. Lambda表达式的单元测试1.1. 单元测试是测试一段代码的行为是否符合预期的方式1.2. Lambda表达式没有名字,无法直接在测试代码中调用1.2.1. 将Lambda表达式放入......
  • Linux系统Shell脚本第四章:shell函数
    目录一、shell函数1、函数的作用2、函数使用步骤3、定义函数基本格式4、函数变量5、退出函数6、函数位置变量与脚本位置变量区别 一、shell函数1、函数的作用定......
  • 函数式接口
    函数式接口函数式接口:有且仅有一个抽象方法的接口函数式接口适用于Lambda表达式只有确保接口中有且仅有一个抽象方法,Lambda才能顺利推导定义一个函数式接口@Funct......
  • python jwt
    jwt->jsonwebtoken一般用于前后端分离项目的用户认证。传统校验需要把token保存在服务端。而jwt不会保存在服务端,通过客户端给的token和算法进行验证。jwt包括三段......
  • [C/C++] 简单实现trim函数:删除字符串头尾空格
    记录一下stringtrim(conststring&s){intstart=0,end=s.size()-1;while(start<s.size()&&s[start]==''){start++;}wh......
  • python传递的值还是引用(即改变返回值或者参数值,是否影响本身)
    Python参数传递采用的是“传对象引用”的方式。这种方式相当于传值和传引用的一种综合。如果函数收到的是一个可变对象(比如字典或者列表或者类)的引用,就能修改对象的原始值......
  • 数据结构-详解优先队列的二叉堆(最大堆)原理、实现和应用-C和Python
    一、堆的基础1.1优先队列和堆优先队列(PriorityQueue):特殊的“队列”,取出元素顺序是按元素优先权(关键字)大小,而非元素进入队列的先后顺序。若采用数组或链表直接实现优......