【Python设计模式】钩子方法

Python钩子函数 hook,又称钩子,在C/C++中一般叫做回调函数。钩子是从功能角度描述这种编程模式,回调则是从函数调用时间角度描述的。通常理解的hook是在一个已有的方法上加入一些钩子,使得在该方法执行前或执行后另在做一些额外的处理。如我们熟知的windows系统消息响应事件,鼠标点击对程序产生的影响是有程序自己决定的,但是程序的执行是受制于框架(windows系统),框架提供了一些通用的流程执行,但是往往框架或流程在设计时无法完全预料到以后的使用会有什么新需求,或者有些行为只有在运行时才能确定的。... 阅读详情

在学习设计模式中的模板方法模式的时候了解到了一个比较陌生的名词——钩子方法,大概看了一下定义。

钩子方法:一个钩子方法由一个抽象类或具体类声明并实现,而其子类可能会加以扩展。通常在父类中给出的实现是一个空实现(可使用virtual关键字将其定义为虚函数),并以该空实现作为方法的默认实现,当然钩子方法也可以提供一个非空的默认实现

大概看懂了之后没有去深究,因为在编写代码的时候很少用到,也可能是代码写得少,但是最近在学习公司的插件编写的时候再次遇到了钩子方法的应用,在我们编写插件的时候如何让程序调用这个插件,但是又不去更改内部的代码,我们只需要编写好我们的插件或者更改插件就能做到改变程序的执行结果呢?这就涉及到了钩子方法。

在模板方法模式中,由于面向对象的多态性,子类对象在运行时将覆盖父类对象,子类中定义的方法也将覆盖父类中定义的方法,因此程序在运行时,具体子类的基本方法将覆盖父类中定义的基本方法,子类的钩子方法也将覆盖父类的钩子方法,从而可以通过在子类中实现的钩子方法对父类方法的执行进行约束,实现子类对父类行为的反向控制。

这里引用了一下LoveLoin老师的文章中的定义,概念写的很清晰易懂,钩子方法就是通过子类的行为去反向控制父类的行为的一种方法,一般会和模板方法一起使用。

class TemplateMethod:
    def play_video(self):
        print('play video')

    def play_picture(self):
        print('play picture')

    def gouzi(self):
        self.play_video()
        if bool_fun():
            print('开始执行钩子方法')
            self.gouzi_method()
        self.play_picture()

    def gouzi_method(self):
        print('我是钩子')

def bool_fun():
    return True


if __name__ == '__main__':
    t = TemplateMethod()
    t.gouzi()

python写起来比较别扭,不过也能从代码中看出来,我们写插件的时候只需要将bool_fun方法修改一下,类中的gouzi方法将根据bool_fun(插件)方法的返回值来决定要不要执行gouzi_method,那我们的bool_fun就可以做成包的形式导入到项目中,每次要更改程序运行之要更改bool_fun所在的文件就好了。
还有一种方法就是通过将父类中的钩子方法抽象进行抽象或者用虚方法实现钩子方法,让父类的一些方法延迟到子类去实现,但是pyhon没有虚方法这个概念,只能用抽象方法去实现。

Python的pytest框架(6)--测试钩子 (hooks) 详细拆解pytest框架的测试钩子hooks 阅读详情

相关推荐

Python设计模式:模板方法模式详解

摘要:模板方法模式是一种行为型设计模式,通过定义算法骨架并将部分步骤延迟到子类实现,提高代码复用性和扩展性。文章以制作饮料为例,详细介绍了该模式的优缺点、核心角色(抽象类和具体类)及应用场景(如框架开发、数据处理流程)。Python代码实现展示了抽象类定义模板方法、具体类(茶和咖啡)实现特定步骤,以及钩子方法的灵活运用。该模式适用于算法结构固定但部分步骤可变的场景,符合开闭原则,但需注意继承带来的局限性。

数据知道的博客 3153

Python中的钩子函数(hooks)介绍使用

python钩子函数的使用、注意事项

zpsimon的博客 5243

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

主要为大家详细介绍了python学习之hook钩子的原理和使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

Python中钩子函数的实现方式

在Python中,钩子函数(Hook)是一种允许你在程序执行的特定点插入自定义代码的技术。它本质上是一种回调机制,当特定事件发生时自动调用预先注册的函数。

m0_46322965的博客 770

OnlyOffice Docker部署全攻略:解除连接限制+文件大小限制+中文字体优化

本文详细介绍了OnlyOffice企业级Docker部署的完整解决方案,重点破解连接限制、文件大小限制和中文字体优化三大核心痛点。通过定制化镜像部署、性能调优配置和中文字体深度优化,帮助企业实现高效稳定的文档协作平台。

weixin_28837817的博客 368

数字IC设计实现之hierarchical flow系列(一)

数字IC设计实现之hierarchical flow系列(一) 最近这段时间小编又比较忙起来了,今天抽空来咖啡厅码字来了,刚到时脑子一片空白,不知道要分享些什么(项目结束后将会在知识星球上分享数字 IC 设计实现 Tapeout 前要review的那些 checklist)。突然间想起来有个星友希望小编分享些数字 IC 设计实现 hierarchical flow 的相关内容。考虑到现在大都采用这种方式来做 design 和实现,那就选这个 topic 了。限于篇幅和时间限制,今天只分享逻辑综合部分和布局布

weixin_37584728的博客 5999

python强大的hook函数

钩子函数(hook function),可以理解是一个挂钩,作用是有需要的时候挂一个东西上去。具体的解释是:钩子函数是把我们自己实现的hook函数在某一时刻挂接到目标挂载点上。

qq_48811377的博客 647

单细胞多组学数据整合分析实战:从原始数据到跨平台合并

本文详细介绍了单细胞多组学数据整合分析的实战流程,从原始数据处理到跨平台合并分析。通过Seurat和Harmony等工具的应用,帮助研究者有效解决批次效应问题,保留真实的生物学信号。文章包含代码示例和常见问题解决方案,特别适合需要进行单细胞合并分析的研究人员参考。

weixin_30752699的博客 90

设计模式Python版 模板方法模式(下)

介绍了GOF模板方法模式的钩子方法,以及用Python实现模板方法模式的钩子方法的示例。

分享、交流、合作 561

四旋翼无人机数学模型推导

本周开始进行四旋翼无人机的学习工作,首先来进行四旋翼无人机的数学模型推导工作。。 四旋翼动力学数学模型 坐标变换 介绍四旋翼数学模型之前,首先引入坐标变换的概念,定义两个坐标系惯性坐标系{E},以及机体坐标系{B},惯性坐标系就相当于在地面建立的、静止不动的坐标系,也是我们操纵无人机所在的空间,而机体坐标系是建立于四旋翼机体之上,随着四旋翼姿态变换而变化,所以建立一种地面上的惯性坐标系与四旋翼机体坐标系之间的转换关系,就有这个必要。 对于惯性坐标系{E},以及机体坐标系{B},它们之间的转换关系

BiuBiuSun的博客 1万+

爬取百度图片

最开始,我们想要爬取图片,首先需要打开百度图库,然后在搜索栏中输入自己想要的图片(比如说壁纸)。接着右键检查,点击网络:起初可能没有名称信息,刷新界面就可以了。打开信息,查看标头内容可以看到请求URL为:复制这串URL,然后在浏览器中打开这个就是我们搜索的壁纸图片的网页内容。怎么找到图片的URL呢?在上述内容中,找到data,可以发现里面每隔一个aiEditData,下面代码的形式是一样的,就相当于一张图片。

weixin_54143563的博客 1942

Python 模板方法模式

Python 模板方法模式摘要 模板方法模式是一种行为型设计模式,用于定义算法骨架并将具体步骤延迟到子类实现。其核心优势在于代码复用、扩展控制和流程一致性。Python实现中,抽象类定义模板方法和钩子方法,子类实现具体步骤。典型应用包括框架生命周期、数据处理管道等。Pythonic实现可通过函数组合替代继承。该模式适合固定流程但需灵活步骤的场景,与策略模式(整体算法替换)形成对比。实际案例包括HTTP请求处理和单元测试框架。

m0_57545130的博客 900

R语言中的混淆矩阵(Confusion Matrix)是一种常用的评估多分类模型性能的工具

除了准确率,混淆矩阵还提供了其他有用的指标,如灵敏度(Sensitivity)、特异度(Specificity)、精确度(Precision)和召回率(Recall)。混淆矩阵通过比较模型预测结果与实际标签的一致性,帮助我们了解模型的分类准确性和错误类型。此外,混淆矩阵还提供了各种错误类型的统计信息,如假阳性(False Positive)和假阴性(False Negative)等。通过混淆矩阵,我们可以了解模型的整体性能和错误类型,从而对模型进行评估和改进。最后,为了更好地理解混淆矩阵的结果,可以使用。

HackSquad的博客 972

设计模式Python版 建造者模式

介绍了GOF设计模式中的建造者模式,以及用Python实现建造者模式的示例。

分享、交流、合作 1806

AFL源码分析之afl-as.c详细注释

前言 afl-as注释好了,明白了是如何进行插桩的,以及插在哪里 本文主要参考Sakura大佬文章:https://eternalsakura13.com/2020/08/23/afl/ 编写不易,如果能够帮助到你,希望能够点赞收藏加关注哦Thanks♪(・ω・)ノ /* Copyright 2013 Google LLC All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); y

hollk’s blog 2172

【Python机器学习】主成分分析(PCA):高维数据的“瘦身术“

主成分分析(PCA)的历史可以追溯到1901年,当时Karl Pearson首次提出了这个概念。在计算机还不存在的年代,PCA是一个纯粹的数学构想,用来简化多变量数据的分析。几十年后,当计算机出现时,PCA成为了数据分析中最早实现的算法之一。从那时起,超过一个世纪的发展中,PCA一直保持着其核心的理论框架和实用价值,这本身就是对这个方法深刻科学性的证明。在现代深度学习时代,许多人可能会认为PCA已经过时了。但事实恰好相反。

nmdbbzcl的博客 981

设计模式 with Python 8:模版方法模式

设计模式 with Python 8:模版方法模式 这可能是会在日常工作中最最常用到的设计模式,没有之一。 以我过往的工作经验,无论是PHP的web框架程序,抑或是安卓本身的框架代码,都大量使用了模版方法模式,所以无论是从更容易的理解框架代码,还是让你使用类似的方式编写重用性更高的代码角度上说,掌握这个模式都是相当重要的。 Let’s go. 茶与咖啡 假设我们要开一家奶茶店,需要对调制饮品进行规范化和程序化管理,首先我们自然需要观察现有的奶茶和咖啡冲泡流程。 class Tea: def prep

梦幻天空 161

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Design Patterns——Template Method入门到情景实战

Template Method 什么是Template Method Template Method的设计思想 简单的说,就是为了避免在多个子类实现某个算法的过程中,应用程序开发人员写错了算法过程,而导致产生了错误的结果。我们让类库开发人员自己写一个固定的算法骨架(于是此模式只能适应于算法骨架基本确定的应用场景!)。让一部分所有类都公用的算法、步骤,在类库中实现,然后让不同的应用程序开发人员书写适用于当前场景的部分步骤,然后调用父类的骨架方法,实现算法! 在Template Method设计模式中有哪些类型

qq_44274276的博客 422

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Python使用数据类dataclasses管理数据对象

dataclasses 是 Python 3.7 引入的一个标准库模块,用于简化数据类的定义。它通过装饰器 @dataclass 自动生成类的一些常用方法,从而减少样板代码,特别适合那些主要用于存储数据的类。1. 减少样板代码传统类需要手动编写__init____repr____eq__# 传统类# 传统类 class Person : def __init__(self , name : str , age : int) : self . name = nameself . age!

博客简介 1257

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Python设计模式详解之13 —— 模板方法模式

Template Method 设计模式是一种行为型设计模式,用于定义一个操作的骨架,将某些步骤延迟到子类中实现,从而允许子类在不改变整体算法结构的情况下重新定义某些步骤。 在 Python 中,Template Method 模式通常使用基类的方法来定义通用算法框架,并通过子类覆盖特定步骤实现具体逻辑。

拾工 901

【再谈设计模式】模板方法模式~算法骨架的构建者

模板方法设计模式是一种行为型设计模式。它包含一个抽象类(在Java和C++中)或者一个抽象基类(在Python中可以通过ABC抽象基类实现类似功能,在Go中通过接口和结构体组合来体现),这个抽象类中定义了一个模板方法,这个模板方法包含了算法的骨架,它按照一定的顺序调用其他的抽象方法或具体方法。抽象方法由子类去实现,从而实现不同的行为。

wnm23的专栏 2140

Python设计模式:模板模式

设计模式十七:模板模式 什么是模板模式 编写优秀代码的一个要素是避免冗余; 模式关注的是消除代码冗余; 无需改变算法结构就能重新定义一个算法的某些部分。 使用场景 发现结构相近的算法中有重复代码,则可以把算法的不变部分留在一个模板方法中,把易变的部分移动到动作/钩子方法中。 典型案例 工人的日常 所有工人都遵从或多或少相同的例行流程,但例行流程的某些特定部分区别又很大。 实例代码 from cow...

生活屁颠过的博客 2万+

【设计模式】Python模板方法模式:从入门到实战

这篇来讲一下模板方法,算法的骨架是固定的,但某些步骤可以让子类自己去实现。

weixin_63434398的博客 880

Python中的`__call__`(模板方法)和`_call`(钩子方法)

Python中__call__和_call方法分别承担模板方法和钩子方法的角色。__call__作为模板方法定义固定流程(如饮品制作步骤),对外提供统一调用入口;_call作为钩子方法由子类实现具体逻辑(如不同饮品的制作细节)。这种设计分离了固定流程和可变实现,父类控制流程框架,子类专注业务定制。在LangChain框架中,Chain类的__call__管理通用流程,子类通过实现_call完成具体任务处理,体现了模板方法模式的核心思想。

qiy_icbc的博客 688

26. 模板方法模式

模板方法模式(Template Method Pattern)是一种行为型设计模式,它定义了一个操作中的算法骨架,将一些步骤延迟到子类中。模板方法使得子类可以不改变算法结构的情况下,重新定义算法的某些特定步骤。关键点:算法骨架:在抽象类中定义算法的结构和步骤。步骤重定义:子类可以重写抽象类中定义的某些步骤,实现特定的行为。控制反转:抽象类控制算法的执行顺序,子类仅负责实现具体步骤。

TinaYuNuo的博客 1378

【Python设计模式】08 模板方法模式-封装算法

八、模板方法模式-封装算法 这章讨论行为型设计模式:模板方法模式 本章主题 模板方法设计模式简介 UML类图剖析模板设计模式 Python3.6 代码实现真实用例 模板方法模式的优缺点 好莱坞原则、模板方法和模板钩子 常见问答 1. 定义模板方法模式 模板方法模式是一种行为型设计模式,它通过一种称为模板方法的方式来定义程序框架或算法 在讨论模板方法模式时,可以使用抽象类来定义算法的步骤 模板方...

E.W的博客 1131
上一篇: VMware虚拟网络编辑器用法
下一篇: PyQt5 QStackedWidget控件应用
只想整天学习
博客等级 码龄8年 187粉丝 153原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值