位置: 编程技术 - 正文

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

  • 营利性医疗机构筹建是什么意思
  • 工程施工科目有没有伙食费啊
  • 工程施工与工程结算在资产负债表里
  • 已收保证金
  • 不动产租赁服务的税率是多少
  • 外经证核销反馈表
  • 增值税纳税申报表在哪里打印
  • 车票抵扣怎么做账
  • 产成品入库金额和售价一样嘛
  • 如何计算应交税
  • 合伙企业无偿获得股权怎么缴税?
  • 承包费收入计入什么科目
  • 企业替员工缴纳商保家财险
  • 医院业务支出包括哪些内容科目
  • 收到原未计入应收项目的交易性金融资产的利息
  • 技术咨询合同包括就特定技术项目提供
  • 营改增后企业所得税不能跨年
  • 民非企业补贴收入要缴纳增值税会计分录怎么写?
  • 个人股权转让是否先分红
  • 税款滞纳金怎么入账
  • 个体工商户餐饮业税率是多少
  • 通用机打发票能报销不
  • 出口佣金会计分录
  • 微众银行账户验证账户0019向您尾号677账户
  • 企业出售固定资产取得的净收益应列入的利润表项目是
  • 营运资金投资额计算公式
  • 开了百分之五的票怎么办
  • 公司员工驻外补贴政策
  • 公司加农户经营模式
  • 跨年度冲减收入
  • 鸿蒙侧边菜单
  • 保证合同的担保范围包括
  • 公司之间债务转让合法吗
  • PHPfor循环语句10的阶乘
  • 弥补亏损需要注意的事项
  • 转让股权怎么做会计分录
  • 编制合并财务报表时,下列各项中不属于子公司
  • 哪些费用需要计提,哪些不需要
  • 物业收取停车费归谁所有
  • 报错500是什么意思
  • 企业实行股权激励的作用
  • 取得土地使用权的方式
  • 投标报名费怎么定
  • 网上打印企业征信流程
  • JavaScript数组长度
  • 简单的php文件
  • 微擎框架是开源的吗
  • php的难点
  • 对企业采取以旧换新方式销售的应税产品
  • 公司注册实收资本能为0嘛
  • nosql sql
  • SQL Server实现split函数分割字符串功能及用法示例
  • 设置sql server的安全认证模式为混合认证模式
  • 单位举办活动
  • 有形动产租赁服务的增值税税率
  • 电子商业承兑汇票的承兑有以下几种方式
  • 汇算清缴 房租
  • 网上银行可以取款吗
  • 债券溢价摊销有什么影响
  • 赔偿款从货款扣除怎么做账
  • 季节性移动的原因
  • 出售固定资产如何缴纳增值税
  • 个人开具发票需要税号吗?
  • win10系统如何将c盘的软件移到d盘
  • windows任务管理
  • win8连接wifi界面消失
  • linux nfs默认服务端口
  • debian7安装教程
  • xp系统如何设置
  • centos 安装perl
  • cocos2dx安装和初步使用
  • 拖曳对象时用的命令
  • 谈一谈js消息机制的理解
  • 关于Air端与android端的通信实现
  • 对xmlHttp对象的理解
  • 聊天界面的新消息通知设置 找不到
  • JavaScript基础教程
  • 试运行期间的收入应如何处理
  • 城市维护建设税税基是什么
  • 计算土地增值税时下列费用准予从收入总额中扣除的有
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设