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中函数传递参数是值传递还是引用传递
Nov 07 Python
Python中%是什么意思?python中百分号如何使用?
Mar 20 Python
python计算两个数的百分比方法
Jun 29 Python
Python爬虫框架scrapy实现downloader_middleware设置proxy代理功能示例
Aug 04 Python
python3使用GUI统计代码量
Sep 18 Python
浅析Django 接收所有文件,前端展示文件(包括视频,文件,图片)ajax请求
Mar 09 Python
利用python在excel中画图的实现方法
Mar 17 Python
Python基于stuck实现scoket文件传输
Apr 02 Python
Python datetime 如何处理时区信息
Sep 02 Python
一篇文章教你用python画动态爱心表白
Nov 22 Python
Opencv 图片的OCR识别的实战示例
Mar 02 Python
Python语法学习之进程的创建与常用方法详解
Apr 08 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中计算中文字符串长度、截取中文字符串的函数代码
2011/08/09 PHP
php生成excel列名超过26列大于Z时的解决方法
2014/12/29 PHP
通过PHP自带的服务器来查看正则匹配结果的方法
2015/12/24 PHP
PHP __call()方法实现委托示例
2019/05/20 PHP
laravel5 Eloquent 实现事务方式
2019/10/21 PHP
网页自动刷新,不产生嗒嗒声的一个解决方法
2007/03/27 Javascript
?牟┛途W扣了一??效果出?? target=
2007/05/27 Javascript
关于flash遮盖div浮动层的解决方法
2010/07/17 Javascript
jquery里的each使用方法详解
2010/12/22 Javascript
jqGrid jQuery 表格插件测试代码
2011/08/23 Javascript
jQuery渐变发光导航菜单的实例代码
2013/03/27 Javascript
js的alert样式如何更改如背景颜色
2014/01/22 Javascript
js实现在同一窗口浏览图片
2014/09/17 Javascript
node.js中的fs.renameSync方法使用说明
2014/12/16 Javascript
微信小程序 Windows2008 R2服务器配置TLS1.2方法
2016/12/05 Javascript
Angular.js中控制器之间的传值详解
2017/04/24 Javascript
jQuery选择器特殊字符与属性空格问题
2017/08/14 jQuery
AngularJs点击状态值改变背景色的实例
2017/12/18 Javascript
迅速了解一下ES10中Object.fromEntries的用法使用
2019/03/05 Javascript
JS实现秒杀倒计时特效
2020/01/02 Javascript
基于element-ui封装可搜索的懒加载tree组件的实现
2020/05/22 Javascript
[15:09]DOTA2国际邀请赛采访专栏:Loda
2013/08/06 DOTA
[13:55]Newbee vs Team Spirit
2018/06/07 DOTA
python和C语言混合编程实例
2014/06/04 Python
理解Python中的类与实例
2015/04/27 Python
python中引用与复制用法实例分析
2015/06/04 Python
Python实现去除图片中指定颜色的像素功能示例
2019/04/13 Python
使用Pyhton 分析酒店针孔摄像头
2020/03/04 Python
keras分类之二分类实例(Cat and dog)
2020/07/09 Python
python将数据插入数据库的代码分享
2020/08/16 Python
铁路安全反思材料
2014/12/24 职场文书
教代会闭幕词
2015/01/28 职场文书
2015-2016年小学教导工作总结
2015/07/21 职场文书
小学运动会加油稿
2015/07/22 职场文书
资深HR教你写好简历中的自我评价
2019/05/07 职场文书
请求模块urllib之PYTHON爬虫的基本使用
2022/04/08 Python