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实现模拟按键,自动翻页看u17漫画
Mar 17 Python
python使用datetime模块计算各种时间间隔的方法
Mar 24 Python
Python实现模拟时钟代码推荐
Nov 08 Python
python获取多线程及子线程的返回值
Nov 15 Python
Python3.6笔记之将程序运行结果输出到文件的方法
Apr 22 Python
python数据处理 根据颜色对图片进行分类的方法
Dec 08 Python
详解利用Python scipy.signal.filtfilt() 实现信号滤波
Jun 05 Python
详细介绍pandas的DataFrame的append方法使用
Jul 31 Python
python实现在线翻译功能
Mar 03 Python
python实现横向拼接图片
Mar 23 Python
python+pygame实现坦克大战小游戏的示例代码(可以自定义子弹速度)
Aug 11 Python
Python与C/C++的相互调用案例
Mar 04 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
用php实现像JSP,ASP里Application那样的全局变量
2007/01/12 PHP
php定时删除文件夹下文件(清理缓存文件)
2013/01/23 PHP
基于PHP实现的事件机制实例分析
2015/06/18 PHP
分享10段PHP常用代码
2015/11/11 PHP
详解js异步文件加载器
2016/01/24 PHP
php-fpm开启状态统计的方法详解
2017/06/23 PHP
php微信开发之音乐回复功能
2018/06/14 PHP
最短的javascript:地址栏载入脚本代码
2011/10/13 Javascript
JavaScript Array Flatten 与递归使用介绍
2011/10/30 Javascript
左右悬浮可分组的网站QQ在线客服代码(可谓经典)
2012/12/21 Javascript
AngularJS中过滤器的使用与自定义实例代码
2016/09/17 Javascript
Angularjs之filter过滤器(推荐)
2016/11/27 Javascript
js HTML5 canvas绘制图片的方法
2017/09/08 Javascript
Node.js引入UIBootstrap的方法示例
2018/05/11 Javascript
微信小程序实现的picker多级联动功能示例
2019/05/23 Javascript
js使用cookie实现记住用户名功能示例
2019/06/13 Javascript
微信小程序 动态修改页面数据及参数传递过程详解
2019/09/27 Javascript
Vue循环中多个input绑定指定v-model实例
2020/08/31 Javascript
Python利用ansible分发处理任务
2015/08/04 Python
Centos Python2 升级到Python3的简单实现
2016/06/21 Python
Python中创建二维数组
2018/10/17 Python
Python绘图Matplotlib之坐标轴及刻度总结
2019/06/28 Python
selenium+Chrome滑动验证码破解二(某某网站)
2019/12/17 Python
python 通过手机号识别出对应的微信性别(实例代码)
2019/12/22 Python
Pytorch保存模型用于测试和用于继续训练的区别详解
2020/01/10 Python
使用 Python 读取电子表格中的数据实例详解
2020/04/17 Python
Python利用Xpath选择器爬取京东网商品信息
2020/06/01 Python
浅谈Html5中视频 音频标签 进度条的问题
2016/07/26 HTML / CSS
几道PHP的面试题
2012/05/19 面试题
OSPF有什么优点?为什么OSPF比RIP收敛快?
2013/02/13 面试题
Laravel中Kafka的使用详解
2021/03/24 PHP
历史系自荐信范文
2013/12/24 职场文书
毕业典礼演讲稿
2014/05/13 职场文书
论文答谢词
2015/01/20 职场文书
公司员工离职感言
2015/08/03 职场文书
简单聊聊Golang中defer预计算参数
2022/03/25 Golang