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中的FTP通信模块ftplib的用法整理
Jul 08 Python
pyenv命令管理多个Python版本
Mar 26 Python
python基于ID3思想的决策树
Jan 03 Python
tensorflow输出权重值和偏差的方法
Feb 10 Python
python 3利用Dlib 19.7实现摄像头人脸检测特征点标定
Feb 26 Python
Django框架文件上传与自定义图片上传路径、上传文件名操作分析
May 10 Python
对python中不同模块(函数、类、变量)的调用详解
Jul 16 Python
Python操作Sqlite正确实现方法解析
Feb 05 Python
Python实现队列的方法示例小结【数组,链表】
Feb 22 Python
使用python3 实现插入数据到mysql
Mar 02 Python
python判断正负数方式
Jun 03 Python
python实现录制全屏和选择区域录屏功能
Feb 05 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中json_encode、json_decode与serialize、unserialize的性能测试分析
2010/06/09 PHP
PHP extract 将数组拆分成多个变量的函数
2010/06/30 PHP
CentOS下PHP7的编译安装及MySQL的支持和一些常见问题的解决办法
2015/12/17 PHP
一段利用WSH获取登录时间的jscript代码
2008/05/11 Javascript
ExtJS Window 最小化的一种方法
2009/11/18 Javascript
js操作二级联动实现代码
2010/07/27 Javascript
jquery处理页面弹出层查询数据等待操作实例
2015/03/25 Javascript
js获取数组的最后一个元素
2015/04/14 Javascript
全面解析Bootstrap中nav、collapse的使用方法
2016/05/22 Javascript
基于Layer+jQuery的自定义弹框
2020/05/26 Javascript
Vue引用第三方datepicker插件无法监听datepicker输入框的值的解决
2018/01/27 Javascript
详解小程序原生使用ES7 async/await语法
2018/08/06 Javascript
vue中英文切换实例代码
2020/01/21 Javascript
webpack5 联邦模块介绍详解
2020/07/08 Javascript
使用vue3重构拼图游戏的实现示例
2021/01/25 Vue.js
详解python并发获取snmp信息及性能测试
2017/03/27 Python
解决Django模板无法使用perms变量问题的方法
2017/09/10 Python
Python中出现IndentationError:unindent does not match any outer indentation level错误的解决方法
2020/04/18 Python
python Tkinter版学生管理系统
2019/02/20 Python
详解pandas如何去掉、过滤数据集中的某些值或者某些行?
2019/05/15 Python
wxPython绘图模块wxPyPlot实现数据可视化
2019/11/19 Python
最新2019Pycharm安装教程 亲测
2020/02/28 Python
Python基于requests库爬取网站信息
2020/03/02 Python
解决安装新版PyQt5、PyQT5-tool后打不开并Designer.exe提示no Qt platform plugin的问题
2020/04/24 Python
VIVOBAREFOOT赤脚鞋:让您的脚做自然的事情
2017/06/01 全球购物
村党支部换届选举方案
2014/05/02 职场文书
网站推广策划方案
2014/06/04 职场文书
抗震救灾标语
2014/06/26 职场文书
邻里守望志愿服务活动方案
2014/08/15 职场文书
自主招生专家推荐信
2015/03/26 职场文书
廉政承诺书2015
2015/04/28 职场文书
检讨书范文大全
2015/05/07 职场文书
常住证明范本
2015/06/23 职场文书
2015年卫生院健康教育工作总结
2015/07/24 职场文书
2016年优秀教师先进事迹材料
2016/02/26 职场文书
微信小程序结合ThinkPHP5授权登陆后获取手机号
2021/11/23 PHP