位置: 编程技术 - 正文

详解Python编程中对Monkey Patch猴子补丁开发方式的运用(python程序讲解)

编辑:rootadmin

推荐整理分享详解Python编程中对Monkey Patch猴子补丁开发方式的运用(python程序讲解),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:python 编程技巧,编程中的python,python 编程技巧,python编程内容,python程序讲解,编程中的python,python编程bim,python编程术语,内容如对您有帮助,希望把文章链接给更多的朋友!

Monkey patch就是在运行时对已有的代码进行修改,达到hot patch的目的。Eventlet中大量使用了该技巧,以替换标准库中的组件,比如socket。首先来看一下最简单的monkey patch的实现。

由于Python中的名字空间是开放,通过dict来实现,所以很容易就可以达到patch的目的。

Python namespace

Python有几个namespace,分别是

locals globals builtin

其中定义在函数内声明的变量属于locals,而模块内定义的函数属于globals。

详解Python编程中对Monkey Patch猴子补丁开发方式的运用(python程序讲解)

Python module Import & Name Lookup

当我们import一个module时,python会做以下几件事情

导入一个module 将module对象加入到sys.modules,后续对该module的导入将直接从该dict中获得 将module对象加入到globals dict中

当我们引用一个模块时,将会从globals中查找。这里如果要替换掉一个标准模块,我们得做以下两件事情

将我们自己的module加入到sys.modules中,替换掉原有的模块。如果被替换模块还没加载,那么我们得先对其进行加载,否则第一次加载时,还会加载标准模块。(这里有一个import hook可以用,不过这需要我们自己实现该hook,可能也可以使用该方法hook module import)如果被替换模块引用了其他模块,那么我们也需要进行替换,但是这里我们可以修改globals dict,将我们的module加入到globals以hook这些被引用的模块。Eventlet Patcher Implementation

现在我们先来看一下eventlet中的Patcher的调用代码吧,这段代码对标准的ftplib做monkey patch,将eventlet的GreenSocket替换标准的socket。

注释比较清楚的解释了代码的意图。代码还是比较容易理解的。这里有一个函数__import__,这个函数提供一个模块名(字符串),来加载一个模块。而我们import或者reload时提供的名字是对象。

这段代码的作用是将标准的ftplib中的对象加入到eventlet的ftplib模块中。因为我们在eventlet.ftplib中调用了inject,传入了globals,而inject中我们手动__import__了这个module,只得到了一个模块对象,所以模块中的对象不会被加入到globals中,需要手动添加。这里为什么不用from ftplib import *的缘故,应该是因为这样无法做到完全替换ftplib的目的。因为from … import *会根据__init__.py中的__all__列表来导入public symbol,而这样对于下划线开头的private symbol将不会导入,无法做到完全patch。

python自动翻译实现方法 本文实例讲述了python自动翻译实现方法。分享给大家供大家参考,具体如下:以前学过python的基础,一般也没用过。后来有一个参数表需要中英文。想

Python的几个高级语法概念浅析(lambda表达式闭包装饰器) 1.匿名函数匿名函数(anonymousfunction)是指未与任何标识符绑定的函数,多用在functionalprogramminglanguages领域,典型应用场合:1)作为参数传给高阶函数(high

深入浅析python继承问题 有如下的代码:classp1:def__init__(self,a,b):print("initinp1")self.a1=aself.b1=bself.f1()deff1(self):print("f1inp1")classc1(p1):def__init__(self,a,b,c=2):print("initinc1")p1.__init__(self,a,b)se

标签: python程序讲解

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

上一篇:Python程序中的观察者模式结构编写示例(python 观察者)

下一篇:python自动翻译实现方法(python自动翻译小工具)

  • 个人应纳税所得额20万交多少税
  • 计提本月增值税会计科目
  • 税负统计口径
  • 专用发票超过360天认证期怎么办?
  • 住宿费取得增值税专用发票,抵扣进项税额如何计算
  • 借贷记账法试算平衡的计算公式有
  • 申报怎么打印
  • 施工单位奖金分配方案
  • 上个月没有结账可以做下个月的账吗
  • 企业因购买材料开出的商业汇票属于什么会计科目
  • 单位月工资总额
  • 公司开出的经济补偿金可以税前扣除吗
  • 股东变动及股东情况章节
  • 没有认证方式
  • 公司亏损转让股权
  • 填报企业所得税资产总额怎么填
  • 个人所得税的标准有几档
  • 海关专用缴款书怎么认证?
  • 所得税收入包含哪些
  • 汇算清缴纳税调整项目明细表怎么填
  • 进口增值税发票可以抵扣吗
  • 其他债券投资出售时交易费用
  • 实收资本要求
  • 没有收入该怎么办
  • 应交增值税与预交增值税报告如何披露
  • php二维数组添加数据
  • 空调应该计入什么科目
  • 王者荣耀中廉颇是哪一个族的族长
  • 去年未计提费用,今年付怎么做账
  • 包装物损坏无法确认
  • wlan和蜂窝版的区别
  • 口腔发炎怎么办最快最有效的方法
  • AUTOMATIC1111/stable-diffusion-webui安装教程
  • 材料采购业务流程
  • 建造合同完工百分比法
  • 阿卡迪亚国家公园景点
  • 石炭纪的树有多高
  • 机关事业单位体检费用标准规定
  • 进项税加计抵扣10%和15%
  • 网络工程师笔记大全
  • php操作mysql数据库
  • csdn创作激励
  • next frame
  • 被称为下一代风华的是
  • opencv制作训练数据集
  • php中字符串的连接运算符是( )
  • 上个月发票税率怎么查
  • 外贸企业收款有限额吗
  • 完美ui
  • sql计算字符串中文个数
  • windows安装mq
  • 防暑降温费用发放标准
  • 新入职员工什么时候发工资
  • 建筑劳务单位
  • mysql数据表存储引擎
  • 税控盘减免税款怎么结转
  • 出口退税款计入营业外收入
  • 企业制造费用包括
  • 月末结转增值税怎么算
  • 如何调整以前年度库存
  • 进项税额已经抵扣会计分录
  • 冲销管理费用如何做分录
  • 往来账怎么记账
  • 进项税大于销项税需要交增值税吗
  • MSSQL转MYSQL,gb2312转utf-8无乱码解决方法
  • ubuntu20.04怎么样
  • win7系统鼠标指针异常
  • Linux Shell 通配符、元字符、转义符使用实例介绍
  • android遇到的难题,怎么解决的
  • clipboard.js无需Flash无需依赖任何JS库实现文本复制与剪切
  • android获取设备输出声音
  • 谷歌的全球化发展战略
  • 你不需要知道我是谁,祖国知道我
  • 深入浅出jquery
  • python中lambda怎么用
  • 税收征收管理与实践
  • 个人出租房屋如何计税?看这篇
  • 党费的缴纳是否扣除所得税
  • 收购烟叶多少公斤违法
  • 增值税发票如何红冲
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设