国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python學習之hook鉤子的原理和使用

2020-02-15 23:22:30
字體:
來源:轉載
供稿:網友

什么是鉤子

之前有轉一篇關于回調函數的文章

鉤子函數、注冊函數、回調函數,他們的概念其實是一樣的。
鉤子函數,顧名思義,就是把我們自己實現的hook函數在某一時刻掛接到目標掛載點上。

1. hook函數,就是我們自己實現的函數,函數類型與掛載點匹配(返回值,參數列表)
2. 掛接,也就是hook或者叫注冊(register),使得hook函數對目標可用
3. 目標掛載點,也就是掛我們hook函數的地方(我們想在這個目標點實現我們自己的功能)

先看一張圖:

 

hook的概念在windows的消息響應機制里面體現的尤為明顯。可能我們大家有寫過windows桌面相關的程序(像MFC),里面有各種消息監聽響應機制。比如,要監聽鼠標左鍵是否按下這個事件,我們要去實現一個onLeftKeyDown()之類的方法,該方法可以稱為鉤子函數。同時,我們還要去注冊鉤子函數,MFC中是通過一組宏來實現的。這樣當鼠標左鍵按下后,就能調到我們定義的方法了。

為什么需要鉤子

大家思考一下上面這個例子,左鍵按下方法具體的邏輯是由框架自身去實現,還是由我們用戶(調用者)去實現呢?顯然應該由我們自己去實現。要提供通用的框架能力,框架自身去實現該方法功能,是沒有意義的,所以框架給提供一個掛載的point,把具體邏輯的實現交給用戶就好了,靈活可用。

鉤子使用

hook是一個編程機制,與語言無關。這里給個python的簡單例子,幫助大家理解:

import timeclass 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()            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 泽州县| 凤庆县| 浦东新区| 竹北市| 元氏县| 孝义市| 涿鹿县| 赤水市| 金湖县| 许昌县| 灌南县| 湟源县| 宣汉县| 黄陵县| 三江| 精河县| 盐津县| 六盘水市| 邻水| 固阳县| 黑山县| 宁南县| 新宁县| 阳泉市| 苏尼特左旗| 齐齐哈尔市| 清原| 湖州市| 新蔡县| 雷波县| 耒阳市| 西峡县| 汝南县| 景德镇市| 江陵县| 河北省| 武隆县| 长宁县| 高碑店市| 深圳市| 修武县|