位置: 编程技术 - 正文

详解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自动翻译小工具)

  • 出口退税政策
  • 什么是税目税基税率,简答题
  • 季度企业所得税申报表怎么填写
  • 小规模 季度
  • 手机银行电子回单生成器
  • 保险公司营销人员个人先进事迹材料
  • 房产税计税依据含税还是不含税
  • 私立医院整容效果都不行吗
  • 预收账款发货
  • 高速公路的发票怎么补
  • 自收自支事业单位是什么意思
  • 纳税服务一体化综合监督工作情况报告
  • 营改增对运输业的影响
  • 本月只有红字发票该怎么申报小规模
  • 如何把两个人的照片合在一起
  • Google Bard VS ChatGPT:哪个是更好的AI聊天机器人?
  • mac文本文件
  • 腾讯电脑管家中如何安装 文件夹上锁专家
  • 工会经费,职工福利费,教育经费的扣除标准
  • 结转未交增值
  • 营业外收入的账户结构
  • 多系统设置
  • 进项税加计抵扣最新政策2019
  • 期货交易的会计分录
  • 汽车维修行业会计分录
  • 公允价值变动损益借贷方向增减
  • 用科目汇总表怎么登记总账
  • 存货 计价
  • 简单谈谈中国法律史的感受
  • php常用设计模式(大总结)
  • linux网络接口状态命令
  • 二手商铺要缴纳契税吗
  • 文件上传漏洞及解决方案
  • 企业所得税税前扣除凭证管理办法
  • 外购产品视同自产产品办理免抵退税的条件有哪几种
  • Yii2 队列 shmilyzxt/yii2-queue 简单概述
  • 流动资产损失
  • CNN+LSTM+Attention实现时间序列预测(PyTorch版)
  • vue组件继承element并重写方法
  • 文化事业建设费减免政策
  • 如何购买增值税发票需要什么资料
  • but all failed
  • 开具信用证费用由谁承担
  • 企业资产损失税前扣除管理办法最新
  • python设置配置文件
  • 审图费谁出
  • 红字信息表开错了怎么撤销
  • dedecms配置
  • 己经认证的发票怎么作废
  • 购买银行短期理财产品的会计处理
  • 怎么计算利润的百分比
  • 外企可以申请高新技术
  • 基金管理公司是什么意思
  • 开发商出售商铺税费
  • 研发人员工资计入什么科目
  • 2021年财务新规定
  • 印花税算错了地方怎么办
  • 债券发行费用计入初始成本会计分录
  • 医药企业研发费用构成
  • 房产税什么时候开始征收2023
  • 怎样计算存款利息?
  • mysql同步问题之Slave延迟很大优化方法
  • mysql详细教程
  • c盘的windows
  • centos server
  • linux 修复系统
  • 高县土火锅历史介绍
  • linux怎么禁用用户
  • nodejs 插件开发
  • Build Qt5.3.1 for Freescale I.MX6Q based Linux 3.0.15
  • unity3d ugui优化
  • ubuntu20.04怎么安装
  • 台湾 游戏论坛
  • javascript教程完整版
  • openlayers3示例
  • jquery easyui开发指南
  • 城市配套费需要缴纳契税
  • 开票系统服务器设置
  • 南宁税务局进面分数线
  • 营业税纳税申报时间
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设