位置: 编程技术 - 正文

详解Python开发中如何使用Hook技巧(python程序的开发过程)

编辑:rootadmin

推荐整理分享详解Python开发中如何使用Hook技巧(python程序的开发过程),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:python开发技术详解,python开发bi,python开发流程的6个阶段,python 程序开发,python 程序开发,python的开发,python 程序开发,python开发技术详解,内容如对您有帮助,希望把文章链接给更多的朋友!

什么是Hook,就是在一个已有的方法上加入一些钩子,使得在该方法执行前或执行后另在做一些额外的处理,那么Hook技巧有什么作用以及我们为什么需要使用它呢,事实上如果一个项目在设计架构时考虑的足够充分,模块抽象的足够合理,设计之初为以后的扩展预留了足够的接口,那么我们完全可以不需要Hook技巧。但恰恰架构人员在项目设计之初往往没办法想的足够的深远,使得后续在扩展时深圳面临重构的痛苦,这时Hook技巧似乎可以为我们带来一记缓兵之计,通过对旧的架构进行加钩子来满足新的扩展需求。

下面我们就来看看如果进行Hook处理,我们按照Hook的对象的层级来逐一介绍

对类进行Hook

也就是说我们得钩子需要监控到类的创建等操作,然后在此之前或之后做我们希望的操作

1、Hook类的创建

你可以在写一个类的时候为其添加__metaclass__属性

Python创建类的过程是这样的:

Foo中有__metaclass__这个属性吗?如果是,Python会在内存中通过__metaclass__创建一个名字为Foo的类。如果Python没有找到__metaclass__,它会继续在Bar(父类)中寻找__metaclass__属性,并尝试做和前面同样的操作。如果Python在任何父类中都找不到__metaclass__,它就会在模块层次中去寻找__metaclass__,并尝试做同样的操作。如果还是找不到__metaclass__,Python就会用内置的type来创建这个类对象。

所以我们需要在给__metaclass__属性的值是一个能够创建一个类的东西,即一个继承type的类。

比如:

Singleton就是一个能够创建类的对象,因为它继承了type

也正因为此,我们可以在Singleton这个类中去监控MyClass的创建过程

2、Hook实例属性

这里我们需要操作的属性是__getattribute__和__getattr__

object.__getattribute__(self, name) :无论访问存在还是不存在的属性都先访问该方法

object.__getattr__(self, name) :当不存在__getattribute__方法或者引发了AttributeError异常时访问该方法

可以看到,访问已有属性a时,__getattribute__被调用,访问未定义的属性aa时__getattribute__先被调用,接着__getattr__被调用

3、Hook类属性

python描述符是一个“绑定行为”的对象属性,在描述符协议中,它可以通过方法重写属性的访问。这些方法有 __get__(), __set__(), 和__delete__()。如果这些方法中的任何一个被定义在一个对象中,这个对象就是一个描述符。

- self: Desc的实例对象,其实就是TestDesc的属性x

- instance: TestDesc的实例对象,其实就是t

- owner: 即谁拥有这些东西,当然是 TestDesc这个类,它是最高统治者,其他的一些都是包含在它的内部或者由它生出来的

为了让描述符能够正常工作,它们必须定义在类的层次上。否则Python无法自动为你调用__get__和__set__方法。

而根据之前对类方法的说明,引用t.x的时候是否会先引用TestDesc的__getattribute__方法呢?答案是会的,其实访问属性时在python中真实的查找顺序是这样的:

1)__getattribute__(), 无条件调用

2)数据描述符(定义了__set__或__delete__的描述符):由1)触发调用 (若人为的重载了该 __getattribute__() 方法,可能会导致无法调用描述符)

3)实例对象的字典

4)类的字典

5)非数据描述符(只定义了__get__的描述符)

详解Python开发中如何使用Hook技巧(python程序的开发过程)

6)父类的字典

7)__getattr__() 方法

4、使用修饰符来Hook类

我们使用singleton方法把MyClass修饰为了一个单例模式,同时我们也在singleton方法中实现了对MyClass实例过程的监控。

对方法进行Hook

1、修饰符来Hook方法

1)修饰不带参数的方法

2)修饰带参数的方法

3)使用带参数的修饰符来修饰方法

其他Hook

1、Hook内建方法

上述操作使得my_open代替了python内置的open方法,故而我们可以使用我们自己的my_open方法来监控后续对open方法的调用了

2、Monkey Patch

实际上这是所有语言都会使用到的Hook技巧,往往在我们使用了第三方的包,希望在之上做一些扩展,但又不想改动原有的代码时使用

多说一句

上述提到了修饰符的操作,那么我们在使用修饰符时有一些小技巧需要了解

1、使用functools

防止使用修饰器后函数签名被改变

这样处理后,foo方法的签名与被修饰之前保持了一致,否则签名将会变成my_dec方法的签名

2、使用decorator模块来做修饰器

3、使用类做修饰器

实际应用中很少遇到可以使用一个类作为修饰器,但实际上只要一个类实现了__call__方法,其就可以作为一个修饰器存在了,并且由于类的可操作性较方法更强大,所以类做修饰器也可以实现更丰富的特性。

下面留个示例深入理解

小编就先聊到这里,今天交流的内容都是硬知识,普通的开发过程中也许并不能使用的上,但了解这些知识对于编程能力的提高很有帮助,也能够帮助你更深入的理解Python的机制。也希望大家多多支持积木网。

机器学习python实战之决策树 决策树原理:从数据集中找出决定性的特征对数据集进行迭代划分,直到某个分支下的数据都属于同一类型,或者已经遍历了所有划分数据集的特征,

Python定时器实例代码 在实际应用中,我们经常需要使用定时器去触发一些事件。Python中通过线程实现定时器timer,其使用非常简单。看示例:importthreadingdeffun_timer():print('HelloTi

机器学习python实战之手写数字识别 看了上一篇内容之后,相信对K近邻算法有了一个清晰的认识,今天的内容——手写数字识别是对上一篇内容的延续,这里也是为了自己能更熟练的掌握k

标签: python程序的开发过程

本文链接地址:https://www.jiuchutong.com/biancheng/372139.html 转载请保留说明!

上一篇:python利用标准库如何获取本地IP示例详解(python标准库很庞大,它可以帮助处理各种工作,包括)

下一篇:Python定时器实例代码

  • 增值税留存比例50
  • 如何查询纳税人状态是否正常
  • 个税申报数是按应发数还是实发数进行申报?
  • 本月销售商品的实际成本怎么算
  • 先报个税还是先报增值税,有影响吗?
  • 过桥过闸通行费会计分录
  • 外资企业订单外放,员工待岗合法吗
  • 红字信息表跨月了还能开吗
  • 企业辅助生产车间
  • 单位结算卡在pos渠道可办理的功能
  • 河道工程修建维护管理费何时开始停征?
  • 公司固定资产丢失谁负责
  • 企业实际发生的与取得收入有关的、合理的支出,包括
  • 补缴企业所得税滞纳金账务处理
  • 土地租赁合同交不交印花税
  • 当月不抵扣的增值税发票怎么做账
  • 报税没有申报现金流量表
  • 设备租赁涉及税种
  • 红字发票怎么申报?
  • 应税行为扣除额期初余额
  • 政府补贴冲减资产原值
  • 收据是否当月入帐
  • 超出经营范围开发票
  • 声卡无声音怎么回事
  • win10更新windows
  • 年度利润总额是会计利润吗
  • 医疗机构医疗服务自查报告怎么写
  • 生产废料怎么处理会计分录
  • 端游上古世纪
  • 企业党建活动经费管理办法的规定
  • win10ie浏览器打开就崩溃
  • 企业注销后账上有结余怎么办
  • php数组函数,选班长
  • 餐费发票怎么做账务处理
  • 30个极致实用的东西
  • 固定资产折旧加计扣除
  • 汇兑差额如何计算
  • php怎么建立数据库mysql
  • 图像深度算法
  • 代理业务怎么记账
  • 是否就地汇总纳税
  • css媒体查询不起作用
  • 关联方计提坏账吗
  • 未开票交税怎么做账
  • 补记以前年度固定资产怎么记账
  • 科技型中小微企业贷款贴息贴保项目入库
  • 资产负债表中的货币资金包括哪些
  • 转出未交增值税会计处理
  • 发票审核中是什么意思
  • 抵押贷款购买商品合法吗
  • 将固定资产转为投资性房地产账务处理
  • 无形资产如何摊销公式
  • 公司购买防疫物资的申请
  • 失业保险金的支付方式
  • 法定盈余公积一般按照企业
  • 本地发生住宿费怎么办
  • 购方收到红字发票怎么开
  • 解析sql语句
  • 大数据量高并发症有哪些
  • CentOS 7中安装mysql server的步骤分享
  • sql自动增长是什么意思
  • mysql5.7分区表
  • window系统怎么更新版本
  • 远程桌面连接没反应
  • ubuntu安装ubuntu-desktop
  • 在windows xp中说法正确的是
  • mac terminal在哪里
  • linux命令行怎么用
  • 禁用强制驱动程序签名有什么用
  • win10系统自带虚拟机怎么用
  • Quick cocos2dx-Lua(V3.3R1)学习笔记(8) ---- 事件篇之单点触摸事件,让我们用精灵模仿一个按钮吧
  • node web 框架
  • 游戏unity错误
  • 地铁酷跑瞬间移动
  • javascript数据类型有哪些
  • jquery移动端ui框架
  • jquery鼠标移动触发
  • 河南车船税收费标准2022年
  • 怎样加入广东省民间文艺家协会
  • 增值税发票打印机怎么调整打印位置
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设