Python猴子补丁Monkey Patch用法实例解析


Posted in Python onMarch 23, 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的Django框架中的模版相关知识
Jul 15 Python
全面理解Python中self的用法
Jun 04 Python
Flask框架的学习指南之开发环境搭建
Nov 20 Python
Python使用迭代器捕获Generator返回值的方法
Apr 05 Python
python学习笔记--将python源文件打包成exe文件(pyinstaller)
May 26 Python
mac PyCharm添加Python解释器及添加package路径的方法
Oct 29 Python
在Python中使用defaultdict初始化字典以及应用方法
Oct 31 Python
对Python的多进程锁的使用方法详解
Feb 18 Python
浅谈django2.0 ForeignKey参数的变化
Aug 06 Python
如何把python项目部署到linux服务器
Aug 26 Python
python opencv图像处理(素描、怀旧、光照、流年、滤镜 原理及实现)
Dec 10 Python
Python之matplotlib绘制折线图
Apr 13 Python
Python面向对象程序设计之静态方法、类方法、属性方法原理与用法分析
Mar 23 #Python
Python3 pickle对象串行化代码实例解析
Mar 23 #Python
Python面向对象程序设计之类和对象、实例变量、类变量用法分析
Mar 23 #Python
Python3 shelve对象持久存储原理详解
Mar 23 #Python
python新式类和经典类的区别实例分析
Mar 23 #Python
Python count函数使用方法实例解析
Mar 23 #Python
使用python实现飞机大战游戏
Mar 23 #Python
You might like
我的论坛源代码(二)
2006/10/09 PHP
用PHP中的 == 运算符进行字符串比较
2006/11/26 PHP
几款极品的javascript压缩混淆工具
2007/05/16 Javascript
JS刷新当前页面的几种方法总结
2013/12/24 Javascript
javascript嵌套函数和在函数内调用外部函数的区别分析
2016/01/31 Javascript
jquery+CSS3实现3D拖拽相册效果
2016/07/18 Javascript
微信小程序 教程之wxapp 视图容器 view
2016/10/19 Javascript
火狐和ie下获取javascript 获取event的方法(推荐)
2016/11/26 Javascript
jQuery插件echarts实现的去掉X轴、Y轴和网格线效果示例【附demo源码下载】
2017/03/04 Javascript
vuex 项目结构目录及一些简单配置介绍
2018/04/08 Javascript
Vue中的vue-resource示例详解
2018/11/02 Javascript
NodeJs 实现简单WebSocket即时通讯的示例代码
2019/08/05 NodeJs
vue 取出v-for循环中的index值实例
2019/11/09 Javascript
vue项目中使用vue-layer弹框插件的方法
2020/03/11 Javascript
[16:21]教你分分钟做大人:圣堂刺客
2014/12/03 DOTA
python3.3使用tkinter开发猜数字游戏示例
2014/03/14 Python
编写自定义的Django模板加载器的简单示例
2015/07/21 Python
Python求算数平方根和约数的方法汇总
2016/03/09 Python
python运行时间的几种方法
2016/06/17 Python
浅谈python写入大量文件的问题
2018/11/09 Python
利用arcgis的python读取要素的X,Y方法
2018/12/22 Python
Python 爬虫实现增加播客访问量的方法实现
2019/10/31 Python
python3 sorted 如何实现自定义排序标准
2020/03/12 Python
详解使用CSS3的@media来编写响应式的页面
2017/11/01 HTML / CSS
全球酒店预订网站:Hotels.com
2016/08/10 全球购物
计算机专业自荐信
2013/10/14 职场文书
《雷雨》教学反思
2014/02/20 职场文书
计算机通信专业推荐信
2014/02/22 职场文书
大班上学期幼儿评语
2014/04/30 职场文书
企业职业病防治方案
2014/05/29 职场文书
家具商场的活动方案
2014/08/16 职场文书
群教班子对照检查材料
2014/08/26 职场文书
教师作风整改措施思想汇报
2014/10/12 职场文书
Python排序算法之插入排序及其优化方案详解
2021/06/11 Python
详解Python+OpenCV绘制灰度直方图
2022/03/22 Python
详解Mysql事务并发(脏读、不可重复读、幻读)
2022/04/29 MySQL