python hook_python_理解篇_钩子方法的理解

大家好,我是金鱼座,一个走在测试领域这片蓝海中, 蹉跎前行的技术渣渣,唯有一直走下去,也许能改变点什么,加油!

钩子方法,是一个比较奇怪的东西, 他实际上不做任何业务操作,主要用于后期注册函数然后引用

举个爪子

#!/usr/bin/python3

# -*- coding: utf-8 -*-

"""

@File : hook_jack.py

@Author: JACK

@Date : 2019/8/22

@Des :

"""

class HookMethodClass(object):

def __init__(self):

self.hook_method = None

def register_method_hook(self, method):

self.hook_method = method

def play(self):

if self.hook_method == None:

print("未接受到注册方法")

else:

print("接受到了方法")

self.hook_method()

def hooked_method():

print("我是一个业务方法,需要注册使用")

if __name__ == "__main__":

pass

hooka = HookMethodClass()

hooka.register_method_hook(hooked_method)

hooka.play()

显示的结果:

result

从上述对比中发现,实际上钩子方法就是里面的register方法, 这样的方式可以在一些特定的场景中,灵活扩展类的对象操作方式,

例如A同学,B同学,都在看书,一个在看语文,一个在看英语中场景

在日常的类设计中,我们会设计如下结构

class Student():

def read():

pass

但是这种方式就会有一个问题,就是我只有读的对象行为,但是我没有读的目标展示,针对这种情况,我们实际上就可以考虑使用钩子方法

class Student_Hook():

def __init__(self, read_book):

self.read_book = None

def reg_book(self, book):

self.read_book = book

def read():

if self.read_book is not None:

self.read_book()

else:

pass

def book_A():

pass

def book_B():

pass

可以了, 如上图, 当然案例可能并没有充分体现出钩子的更加综合的体验,但是从理解来说,我们知道,钩子就等于是将两个方法通过一种关联方法,实现相关的引用,就想案例中的reg_book,通过这种关联引用,来达到read中的只需要判断是否有方法,有就执行,没有就不执行,而不用去人为if判断是A,B,然后对应去执行bookA和BookB

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/498806.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android layoutparams,Android LayoutParams用法解析

ViewGroup.LayoutParams介绍LayoutParams携带了子控件针对父控件的信息,告诉父控件如何放置自己LayoutParams类也只是简单的描述了宽高,宽和高都可以设置成三种值:1,一个确定的值;2,FILL_PARENT&#xff0c…

python 文本文件处理_53 Python - txt普通文件处理

今天讲的内容是关于数据文件的读写,我们都知道如果是普通的文本文件就比较简单,我们可以使用自带的open 方法打开我们的文件,可以使用read 和write进行读写回顾,我们把不同文件的操作放到不同文件里面新建一个目录txt,…

android静态类保存context,Android:静态获取Context是一个好习惯吗?

public class MyApp extends Application {private static Context context;public void onCreate(){super.onCreate();MyApp.context getApplicationContext();}public static Context getContext() {return MyApp.context;}}我使用它来在既不是活动也不是片段的类中使用Cont…

c# 计算空格宽度像素_C# WinForm,Graphics.MeasureString 计算不准确的坑

Graphics.MeasureString 可以计算出指定字符串在给定字体Font的尺寸SizeF,它的计算有坑:如果把字符串拆开成一个一个单字字符串并逐个计算尺寸,然后把Width加起来,你会发现并不一定等于完整的字符串计算出来的Width。经过一番折腾…

鸿蒙os 芯片制程,华为Mate50将如期发布,屏下镜头+鸿蒙OS,再见iPhone12

华为旗下有两个高端产品线,一个是mate一个就是P系列,这两款产品发布会一般相隔半年左右,按理说华为P50也该上日程了,可因为芯片缺货问题耽搁了,预计将会在7月份发布。安按照华为往常的新机发布节奏去看,华为…

nstimer循环引用_警惕使用NSTimer时的循环引用

使用NSTimer可能会碰到循环引用的问题。特别是当类具有NSTimer类型的成员变量,并且需要反复执行计时任务时。例如_timer [NSTimer scheduledTimerWithTimeInterval:5.0target:selfselector:selector(startCounting) userInfo:nilrepeats:YES];类有一个成员变量_tim…

html中写色块,CSS3 彩虹色块

CSS语言:CSSSCSS确定html,body {min-height: 100%;}body {background-image: url(data:image/svgxml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIPGRlZnMPHJhZGlhbEdyYW…

奎享添加自己字体_奎享雕刻软件写字操作简要说明

关于奎享雕刻软件单线字书写操作步骤的简要说明特别提醒!设备完全调试好以后再练习写字,调试好的标志是用微雕管家刀路雕刻界面能顺利画出一张........&#…

mysql load data infile 导入数据 某一列 空_Sql数据挑战赛amp;网络销售案例分析

SQL挑战赛第一期:1: 编写一个查询&#xff0c;列出员工姓名列表&#xff0c;员工每月工资超过2000美元且员工工作时间少于10个月。通过提升employee_id对结果进行排序select name from employee where salary > 2000 and months < 10 order by employee_id;2: 查询 Emplo…

哪个html标签用于定义文档的标题,在HTML中,(41)用于定义文档的标题。

Packet switching is a method of slicing __(71)__ messages into parcels called “packets,” sending the packets along different communication __(72)__ as they become available, and then reassembling the packets __(73)__they arrive at their destination. Prio…

stm32的afio初始化代码_STM32-IO-AFIO(复用功能IO和调试配置)

最近在学习STM32&#xff0c;在BZ上一篇关于的串口通信文章里有这么一段代码&#xff1a;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD| RCC_APB2Periph_AFIO,ENABLE);当初是参考开发的里子写的一直对GPIOD或上“RCC_APB2Periph_AFIO”这句话的意思没搞懂&#xff0c;通过这几…

js获取dom html元素属性,JS如何通过元素的CLASS属性得到对应的DOM对象?

非IE6,7,8可以直接用自带的属性 getElementsByClassName,如果需要考虑兼容&#xff0c;就需要自己写了。下面是自己写的&#xff1a;function getClassName(obj,sName) //-->obj是要获取元素的父级{ //-->sName是class名字if(document.getElementsByClassName){return ob…

feign调用多个服务_spring cloud各个微服务之间如何相互调用(Feign、Feign带token访问服务接口)...

1、首先先看什么是Feign。2、若其他服务的接口未做权限处理&#xff0c;参照上文第1点的博文即可。3、若其他服务的接口做了权限的处理(例如OAuth 2)时该如何访问?a、有做权限处理的服务接口直接调用会造成调用时出现http 401未授权的错误&#xff0c;继而导致最终服务的http …

html项目列表页面源码,HTML 列表

HTML 列表HTML 支持有序、无序和定义列表:HTML 列表有序列表第一个列表项第二个列表项第三个列表项无序列表列表项列表项列表项在线实例无序列表本例演示无序列表。有序列表本例演示有序列表。(可以在本页底端找到更多实例。)HTML无序列表无序列表是一个项目的列表&#xff0c;…

vue 实现数据滚动显示_vue实现动态添加数据滚动条自动滚动到底部的示例代码...

在使用vue实现聊天页面的时候&#xff0c;聊天数据动态加到页面中&#xff0c;需要实现滚动条也自动滚动到底部。这时我找到网上有个插件 vue-chat-scroll但是安装后发现是用不了的&#xff0c;报错信息如下&#xff1a;VM14383:27 [Vue warn]: Failed to resolve directive: c…

linux关机方法有哪些?有何区别_Linux关机命令大全:Linux各关机命令之间的区别和用法...

Linux怎么用命令来进行关机/重启呢&#xff1f;Linux是一套免费使用和自由传播的类Unix操作系统&#xff0c;想使用Linux系统的关机命令必须要拿到root权限&#xff0c;下面给大家介绍一些Linux常用的关机命令以及各关机命令之间的区别和用法。Linux系统下常用的一些关机命令&a…

html5 canvas裁剪图片,html5-canvas 使用画布裁剪图像

示例本示例显示了一个简单的图像裁剪功能&#xff0c;该功能获取图像和裁剪坐标并返回裁剪后的图像。function cropImage(image, croppingCoords) {var cc croppingCoords;var workCan document.createElement("canvas"); // 创建一个画布workCan.width Math.floor…

html用转义字符画菱形,JavaScript生成字符画(ASCII Art)

今天玩一些新的东西&#xff0c;大家都没有看过这样的视频&#xff1a;或者 这样的图片&#xff1a;网上有很多生成这种图片/视频的工具&#xff0c;但是每个程序员都有一颗造轮子的心&#xff0c;我们当然要玩出自己的花样啦。老规矩&#xff0c;还是先讲原理&#xff0c;建议…

大数据职业理解_大数据带给我们职业三大根本改变

那么&#xff0c;大数据为什么成为所有人关注的焦点?大数据带来了什么样的本质性改变?为此&#xff0c;我们与中国计算机学会大数据学术带头人、中国人民大学信息学院院长杜小勇教授进行了访谈。大数据(Big data)通常用来形容数字化时代下创造出的大量非结构化和半结构化数据…

微信更新对html影响,微信再次大更新 将极大影响用户使用习惯

[导读]微信再次迎来历史性大更新&#xff0c;小程序终于展露腾讯野心&#xff01;微信再次迎来历史性大更新&#xff0c;小程序终于展露腾讯野心!...微信小程序桌面在昨日1月22日晚&#xff0c;微信更新7.0.3版本&#xff0c;腾讯在App Store中只表示&#xff1a;本次是一次小更…