什么是钩⼦
之前有转⼀篇关于回调函数的
钩⼦函数、注册函数、回调函数,他们的概念其实是⼀样的。
钩⼦函数,顾名思义,就是把我们⾃⼰实现的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
本站由北京市万商天勤律师事务所王兴未律师提供法律服务