您好,欢迎来到尚佳旅游分享网。
搜索
您的当前位置:首页python学习之hook钩子的原理和使用

python学习之hook钩子的原理和使用

来源:尚佳旅游分享网
python学习之hook钩⼦的原理和使⽤

什么是钩⼦

之前有转⼀篇关于回调函数的

钩⼦函数、注册函数、回调函数,他们的概念其实是⼀样的。

钩⼦函数,顾名思义,就是把我们⾃⼰实现的hook函数在某⼀时刻挂接到⽬标挂载点上。 1. hook函数,就是我们⾃⼰实现的函数,函数类型与挂载点匹配(返回值,参数列表) 2. 挂接,也就是hook或者叫注册(register),使得hook函数对⽬标可⽤

3. ⽬标挂载点,也就是挂我们hook函数的地⽅(我们想在这个⽬标点实现我们⾃⼰的功能) 先看⼀张图:

hook的概念在windows的消息响应机制⾥⾯体现的尤为明显。可能我们⼤家有写过windows桌⾯相关的程序(像MFC),⾥⾯有各种消息监听响应机制。⽐如,要监听⿏标左键是否按下这个事件,我们要去实现⼀个onLeftKeyDown()之类的⽅法,该⽅法可以称为钩⼦函数。同时,我们还要去注册钩⼦函数,MFC中是通过⼀组宏来实现的。这样当⿏标左键按下后,就能调到我们定义的⽅法了。为什么需要钩⼦

⼤家思考⼀下上⾯这个例⼦,左键按下⽅法具体的逻辑是由框架⾃⾝去实现,还是由我们⽤户(调⽤者)去实现呢?显然应该由我们⾃⼰去实现。要提供通⽤的框架能⼒,框架⾃⾝去实现该⽅法功能,是没有意义的,所以框架给提供⼀个挂载的point,把具体逻辑的实现交给⽤户就好了,灵活可⽤。 钩⼦使⽤

hook是⼀个编程机制,与语⾔⽆关。这⾥给个python的简单例⼦,帮助⼤家理解:

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):

# get up self.get_up() time.sleep(3) # 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) # unhooked else:

print(\"no tv to watch\") time.sleep(3) # 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)

# unhooked else:

print(\"nothing to eat at dinner\") time.sleep(3)

self.go_to_sleep()

def watch_daydayup(name):

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)

if __name__ == \"__main__\": 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()

代码运⾏结果:

Tom get up at:1509246940.32

Tom : The program ---day day up--- is funnyTom : The meat is nice

Tom go to sleep at:1509246949.34Jerry get up at:1509246949.34

Jerry : The program ---happy family--- is boringJerry : The hamburger is not so badJerry go to sleep at:1509246958.37

以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- shangjiatang.cn 版权所有 湘ICP备2022005869号-4

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务