位置: 编程技术 - 正文

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

  • 出口免税收入会退税吗
  • 电动三轮车发票和合格证丢了怎么上牌照
  • 每股收益无差别点计算公式怎么解
  • 商誉要摊销和减值吗?
  • 如何在电子税务局开具全电发票
  • 哪些进项税额可以转出
  • 误餐补助缴个税怎么申报
  • 个税隔一个月没申报这个月可以补上吗
  • 税务系统 受理
  • 个税专项附加扣除是每个月扣还是按年计算
  • 以前年度管理费用多计
  • 产品检验费怎样做账?
  • 货车挂靠企业需要交增值税吗?
  • 个人借款到期未还诉讼时效
  • 筹建期如何界定
  • 建筑业开具发票新规定
  • 一般和小规模纳税人哪个免税
  • 维修材料费主要包括
  • 企业法人和股份的关系
  • 水利建设基金按什么基数计算
  • 把十六点改成十五点半起床
  • 小规模季度划分
  • 非房地产企业转让旧房土地增值税
  • 法人名下两家公司,客户买货可以用另外一个公司开票吗
  • 资源费用怎么算
  • 工资年终奖金扣多少税
  • 其他收益与营业外收入的区别
  • 1697510649
  • 公司名下商品房卖给个人后房产税怎么交
  • windows11下载后怎么安装
  • 预提费用支付是指什么
  • 房产税如何进行计提
  • 我想设置应用
  • 广告公司发生的费用要计入主营业务成本吗
  • 外籍人员个人所得税政策2023规定
  • 电脑的nip是什么
  • 提高stable diffusion速度
  • 股权投资取得的收入计入什么科目
  • 离职赔偿金计入什么费用
  • vue 实战
  • php如何实现
  • 聊聊vue3的defineProps、defineEmits、defineExpose
  • 蓝桥杯第十四届省赛获奖名单
  • yolov5tiny
  • 宝塔wordpress安装
  • 公司买办公用品是谁的工作
  • 现金流是什么意思举例
  • 季度申报所得税时可以用以前年度亏损吗
  • u8存货核算对方科目怎么设置
  • 季节性停工计入当期损益吗
  • 全国通用机打销售票查询
  • 科目余额表怎么填
  • 新旧会计准则对比
  • c#连接access数据库实例
  • 在Windows平台上不属于命令ar-d的作用是
  • 母子公司合并报表案例
  • 一般纳税人企业所得税怎么征收
  • 动迁补偿金
  • 营业外支出是什么类账户
  • 企业尚未给予指定用途
  • 固定资产的折旧标准
  • 非营利医疗机构有哪些
  • 详解MySQL中ALTER命令的使用
  • window10用久了都会慢吗
  • Win10 Mobile 10572快速配置更新推送 Win10 Mobile 10572升级体验
  • linux中安装软件可使用哪些方式
  • win7笔记本任务管理器
  • 进程 内核栈
  • jquery实现
  • shell编程怎么执行
  • 批处理copy合并文件
  • node js入门
  • 如何用node搭建服务器
  • js清除文本框内的文字
  • js脚本使用教程
  • python怎么编函数
  • 谷歌chrome浏览器网页版网址
  • 悬浮工具栏
  • 贵州省国家税务局电子税务局官网
  • 浙江国地税联合电子税务局哪里看收到的发票
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设