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算法应用实战之队列详解
Feb 04 Python
Python实现的单向循环链表功能示例
Nov 10 Python
对python实时得到鼠标位置的示例讲解
Oct 14 Python
python机器人运动范围问题的解答
Apr 29 Python
解决Python内层for循环如何break出外层的循环的问题
Jun 24 Python
django-allauth入门学习和使用详解
Jul 03 Python
python实现最大优先队列
Aug 29 Python
Python彻底删除文件夹及其子文件方式
Dec 23 Python
如何通过python实现全排列
Feb 11 Python
浅谈python 中的 type(), dtype(), astype()的区别
Apr 09 Python
Python中pass的作用与使用教程
Nov 13 Python
如何使用Python实现一个简易的ORM模型
May 12 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导出word格式数据的代码实例
2013/11/25 PHP
PHP中set error handler函数用法小结
2015/11/11 PHP
Yii使用技巧大汇总
2015/12/29 PHP
浅谈php(codeigniter)安全性注意事项
2017/04/06 PHP
php7基于递归实现删除空文件夹的方法示例
2017/06/15 PHP
PHP封装的page分页类定义与用法完整示例
2018/12/24 PHP
javascript中的有名函数和无名函数
2007/10/17 Javascript
页面版文本框智能提示JS代码
2009/11/20 Javascript
新发现一个骗链接的方法(js读取cookies)
2012/01/11 Javascript
IE、FF、Chrome浏览器中的JS差异介绍
2013/08/13 Javascript
二叉树的非递归后序遍历算法实例详解
2014/02/07 Javascript
javascript ajax的5种状态介绍
2014/08/18 Javascript
浅谈javascript中字符串String与数组Array
2014/12/31 Javascript
JavaScript获取并更改input标签name属性的方法
2015/07/02 Javascript
jQuery实现根据生日计算年龄 星座 生肖
2016/11/23 Javascript
vue中keep-alive的用法及问题描述
2018/05/15 Javascript
微信小程序云开发之新手环境配置
2019/05/16 Javascript
javascript实现的图片预览和上传功能示例【兼容IE 9】
2020/05/01 Javascript
JS常见错误(Error)及处理方案详解
2020/07/02 Javascript
常见python正则用法的简单实例
2016/06/21 Python
python实现可以断点续传和并发的ftp程序
2016/09/13 Python
Python实现的桶排序算法示例
2017/11/29 Python
PyQt5中QTableWidget如何弹出菜单的示例代码
2020/02/23 Python
Python爬虫爬取电影票房数据及图表展示操作示例
2020/03/27 Python
jupyter notebook 多行输出实例
2020/04/09 Python
python+pygame实现坦克大战小游戏的示例代码(可以自定义子弹速度)
2020/08/11 Python
如何在网站上添加谷歌定位信息
2016/04/16 HTML / CSS
HOTEL INFO英国:搜索全球酒店
2019/08/08 全球购物
如何防止同一个帐户被多人同时登录
2013/08/01 面试题
工程管理专业个人求职信范文
2013/12/07 职场文书
大学生毕业求职信
2014/06/12 职场文书
网上祭先烈心得体会
2014/09/01 职场文书
在教室放鞭炮的检讨书
2014/09/28 职场文书
优秀党务工作者先进事迹材料
2014/12/25 职场文书
2015年青年志愿者协会工作总结
2015/04/27 职场文书
国家助学贷款承诺书
2015/04/30 职场文书