Python猴子补丁知识点总结


Posted in Python onJanuary 05, 2020

属性在运行时的动态替换,叫做猴子补丁(Monkey Patch)。

为什么叫猴子补丁

属性的运行时替换和猴子也没什么关系,关于猴子补丁的由来网上查到两种说法:

1.这个词原来为Guerrilla Patch,杂牌军、游击队,说明这部分不是原装的,在英文里guerilla发音和gorllia(猩猩)相似,再后来就写了monkey(猴子)。

2.还有一种解释是说由于这种方式将原来的代码弄乱了(messing with it),在英文里叫monkeying about(顽皮的),所以叫做Monkey Patch。

猴子补丁的叫法有些莫名其妙,只要和“模块运行时替换的功能”对应就行了。

猴子补丁的用法

1、运行时动态替换模块的方法

stackoverflow上有两个比较热的例子,

consider a class that has a method get_data. This method does an

external lookup (on a database or web API, for example), and various

other methods in the class call it. However, in a unit test, you don't

want to depend on the external data source - so you dynamically

replace the get_data method with a stub that returns some fixed data.

假设一个类有一个方法get_data。这个方法做一些外部查询(如查询数据库或者Web API等),类里面的很多其他方法都调用了它。然而,在一个单元测试中,你不想依赖外部数据源。所以你用哑方法态替换了这个get_data方法,哑方法只返回一些测试数据。

另一个例子引用了,Zope wiki上对Monkey Patch解释:

from SomeOtherProduct.SomeModule import SomeClass

def speak(self):

  return "ook ook eee eee eee!"

SomeClass.speak = speak

还有一个比较实用的例子,很多代码用到 import json,后来发现ujson性能更高,如果觉得把每个文件的import json 改成 import ujson as json成本较高,或者说想测试一下用ujson替换json是否符合预期,只需要在入口加上:

import json

import ujson

def monkey_patch_json():

  json.__name__ = 'ujson'

  json.dumps = ujson.dumps

  json.loads = ujson.loads

monkey_patch_json()

2、运行时动态增加模块的方法

这种场景也比较多,比如我们引用团队通用库里的一个模块,又想丰富模块的功能,除了继承之外也可以考虑用Monkey Patch。

个人感觉Monkey Patch带了便利的同时也有搞乱源代码优雅的风险。

以上就是相关知识点总结,感谢大家的学习和对三水点靠木的支持。

Python 相关文章推荐
python计算牛顿迭代多项式实例分析
May 07 Python
在Python中用get()方法获取字典键值的教程
May 21 Python
Django实现全文检索的方法(支持中文)
May 14 Python
浅析Python 实现一个自动化翻译和替换的工具
Apr 14 Python
pandas基于时间序列的固定时间间隔求均值的方法
Jul 04 Python
Python实现微信机器人的方法
Sep 06 Python
带你彻底搞懂python操作mysql数据库(cursor游标讲解)
Jan 06 Python
Python多线程threading创建及使用方法解析
Jun 17 Python
python利用google翻译方法实例(翻译字幕文件)
Sep 21 Python
Python 实现进度条的六种方式
Jan 06 Python
pytest配置文件pytest.ini的详细使用
Apr 17 Python
图神经网络GNN算法
May 11 Python
Python调用Windows API函数编写录音机和音乐播放器功能
Jan 05 #Python
django ajax发送post请求的两种方法
Jan 05 #Python
关于tensorflow的几种参数初始化方法小结
Jan 04 #Python
基于TensorFlow常量、序列以及随机值生成实例
Jan 04 #Python
Tensorflow 实现分批量读取数据
Jan 04 #Python
Tensorflow的常用矩阵生成方式
Jan 04 #Python
Tensorflow读取并输出已保存模型的权重数值方式
Jan 04 #Python
You might like
解析php DOMElement 操作xml 文档的实现代码
2013/05/10 PHP
PHPExcel读取EXCEL中的图片并保存到本地的方法
2015/02/14 PHP
javascript 三种方法实现获得和设置以及移除元素属性
2013/03/20 Javascript
js replace替换所有匹配的字符串
2014/02/13 Javascript
简单易用的倒计时js代码
2014/08/04 Javascript
JavaScript AOP编程实例
2015/06/16 Javascript
js实现表单多按钮提交action的处理方法
2015/10/24 Javascript
JavaScript中的冒泡排序法
2016/08/03 Javascript
Bootstrap modal 多弹窗之叠加关闭阴影遮罩问题的解决方法
2017/02/27 Javascript
微信小程序 实现列表项滑动显示删除按钮的功能
2017/04/13 Javascript
基于easyui checkbox 的一些操作处理方法
2017/07/10 Javascript
angular中的cookie读写方法
2017/08/02 Javascript
jQuery实现上传图片前预览效果功能
2017/08/03 jQuery
Node.js简单入门前传
2017/08/21 Javascript
解决vue移动端适配问题
2018/12/12 Javascript
Node.js 实现远程桌面监控的方法步骤
2019/07/02 Javascript
[01:18]DOTA2超级联赛专访hanci ForLove淘汰感言曝光
2013/06/04 DOTA
[49:11]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第二场 12.20
2020/12/23 DOTA
Python3中使用urllib的方法详解(header,代理,超时,认证,异常处理)
2016/09/21 Python
Python实现MySQL操作的方法小结【安装,连接,增删改查等】
2017/07/12 Python
Python星号*与**用法分析
2018/02/02 Python
Python网络爬虫神器PyQuery的基本使用教程
2018/02/03 Python
python如何制作缩略图
2019/04/30 Python
利用Django模版生成树状结构实例代码
2019/05/19 Python
matplotlib制作雷达图报错ValueError的实现
2021/01/05 Python
CSS3 Flexbox中flex-shrink属性的用法示例介绍
2013/12/30 HTML / CSS
澳大利亚玩具剧场:Toy Playhouse
2019/03/03 全球购物
车工岗位职责
2013/11/26 职场文书
物业管理计划书
2014/01/10 职场文书
司法所长先进事迹
2014/06/02 职场文书
公司行政专员岗位职责
2014/08/24 职场文书
改革共识倡议书
2014/08/29 职场文书
公务员保密工作承诺书
2015/05/04 职场文书
2015年端午节活动策划书
2015/05/05 职场文书
简单的辞职信模板
2015/05/12 职场文书
Golang 实现获取当前函数名称和文件行号等操作
2021/05/08 Golang