位置: 编程技术 - 正文

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

  • 事业单位怎么给分
  • 车船税减免税优惠政策
  • 个人天猫怎么开网店
  • 代理记账公司账本
  • 水果店个体户怎么交税 广州
  • 个体户超过3万交个人所得税
  • 甲方代付材料费合法吗
  • 消费税计税依据含不含消费税
  • 税务机关退水利基金怎么做账?
  • 货款和发票金额不符
  • 保费收入确认的条件
  • 耕地占用税如何做账
  • 个人所得税生育险
  • 生产企业出口退税退的是哪部分的税
  • 交上月增值税的凭证
  • 外籍人士劳务费怎么交税
  • 电商确认收货
  • 地税局完税证明去哪里办理
  • 酒店住宿收入确认原则的条件
  • 通用申报表工会经费可以不申报吗
  • 个体户酒店服务业个税税率
  • 发票跨年了还能认证吗
  • 小规模未达起征点附加税要计提吗
  • 无法划分进项税额包括什么
  • 加装固态后如何分盘
  • 补助是按基本工资还是总工资
  • win7玩什么游戏流畅
  • linux-4.4
  • 电脑麦克风对方听不到声音怎么办
  • PHP:stream_get_meta_data()的用法_Stream函数
  • 购进农产品发生非正常损失
  • 融资租入固定资产的改建支出
  • php框架ci
  • php常用的魔术方法有哪些
  • 金蝶专业版怎么用
  • 应付国库集中支付结余在什么时候确认
  • 外地预交的企业所得税如何在季度企业所得税申报
  • 税审报告什么时候需要
  • 银行手续费发票未到怎样做账
  • 帝国cms使用手册
  • 自由会计服务类工作者
  • 选择mysql数据库为当前数据库
  • 委托收款的含义
  • 小规模纳税人起征点变化历程
  • 防暑降温费用发放标准
  • 跨区域预缴税款流程
  • 内部审计主要目的
  • 行政单位现金管理
  • 加班打车费用计入什么科目
  • 银行承兑汇票收款人是谁
  • 总资产利润率一般为多少
  • 公司法人转账到公司账户
  • 发生额大额标准怎么确定
  • 是不是根据营业执照查询
  • 净资产是什么意思举例说明
  • 商品流通企业进货费用
  • 怎样把有余额的钱取出来
  • windows10x预览版
  • windows10下软件的app
  • ubuntu系统中文件夹不能改名
  • autorun.inf在win10
  • XP IIS5.1 + PHP 5.2.1 + MySQL 5.0.37 + Zend 3.2.6 + phpMyAdmin-2.10.0.2环境配置
  • xp系统操作全程图解
  • linux系统如何安装应用
  • win7系统无法自动检测此网络的代理设置
  • Javascript之Number对象介绍
  • perl实例
  • Unity3D游戏开发pdf
  • opengl基本图形绘制
  • 数据结构分析时间复杂度
  • dos 到指定目录
  • unity销毁预制体
  • python拷贝列表
  • 各种手机ui大全
  • python动态绑定属性
  • 减免性质代码怎么会自动选择
  • 税务局开蔬菜普票需要几个点
  • 买辆12万的车上路共需要多少钱
  • 请领导审核怎么说
  • 福建税务网址
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设