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网络编程示例(客户端与服务端)
Apr 24 Python
Python的Django框架中的select_related函数对QuerySet 查询的优化
Apr 01 Python
使用Python写个小监控
Jan 27 Python
python使用json序列化datetime类型实例解析
Feb 11 Python
python列表生成式与列表生成器的使用
Feb 23 Python
如何更优雅地写python代码
Jul 02 Python
Numpy的简单用法小结
Aug 28 Python
Python logging设置和logger解析
Aug 28 Python
Windows下pycharm创建Django 项目(虚拟环境)过程解析
Sep 16 Python
Python3 使用map()批量的转换数据类型,如str转float的实现
Nov 29 Python
详解python 中in 的 用法
Dec 12 Python
Python机器学习应用之工业蒸汽数据分析篇详解
Jan 18 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绘制在图片上的正余弦曲线
2013/06/08 PHP
ThinkPHP框架搭建及常见问题(XAMPP安装失败、Apache/MySQL启动失败)
2016/04/15 PHP
/etc/php-fpm.d/www.conf 配置注意事项
2017/02/04 PHP
PHP ob缓存以及ob函数原理实例解析
2020/11/13 PHP
对象的类型:本地对象(1)
2006/12/29 Javascript
javascript 放大镜效果js组件 qsoft.PopBigImage.v0.35 加入了chrome支持
2009/04/07 Javascript
javascript使用eval或者new Function进行语法检查
2010/10/16 Javascript
brook javascript框架介绍
2011/10/10 Javascript
了解一点js的Eval函数
2012/07/26 Javascript
javascript判断数组内是否重复的方法
2015/04/21 Javascript
jquery使用ul模拟select实现表单美化的方法
2015/08/18 Javascript
jQuery实现的鼠标滑过弹出放大图片特效
2016/01/08 Javascript
基于JS分页控件实现简单美观仿淘宝分页按钮效果
2016/11/07 Javascript
JS百度地图搜索悬浮窗功能
2017/01/12 Javascript
node.js(express)中使用Jcrop进行图片剪切上传功能
2017/04/21 Javascript
H5手机端多文件上传预览插件
2017/04/21 Javascript
详解vue+vueRouter+webpack的简单实例
2017/06/17 Javascript
js实现多张图片延迟加载效果
2017/07/17 Javascript
提升页面加载速度的插件InstantClick
2017/09/12 Javascript
Bootstrap Fileinput 4.4.7文件上传实例详解
2018/07/25 Javascript
javascript设计模式 ? 桥接模式原理与应用实例分析
2020/04/13 Javascript
Flask SQLAlchemy一对一,一对多的使用方法实践
2013/02/10 Python
python常用知识梳理(必看篇)
2017/03/23 Python
Python下调用Linux的Shell命令的方法
2018/06/12 Python
python tkinter实现界面切换的示例代码
2019/06/14 Python
pytorch: Parameter 的数据结构实例
2019/12/31 Python
python GUI库图形界面开发之PyQt5复选框控件QCheckBox详细使用方法与实例
2020/02/28 Python
如何使用Django Admin管理后台导入CSV
2020/11/06 Python
Pyecharts 中Geo函数常用参数的用法说明
2021/02/01 Python
CSS3实现线性渐变用法示例代码详解
2020/08/07 HTML / CSS
HTML5通过调用canvas对象的getContext()方法来获取绘图环境
2014/06/23 HTML / CSS
基于HTML5 Canvas的3D动态Chart图表的示例
2017/11/02 HTML / CSS
Delphi笔试题
2016/11/14 面试题
烹饪自我鉴定
2014/03/01 职场文书
年度评优评先方案
2014/06/03 职场文书
网络技术专业求职信
2014/07/13 职场文书