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字符串替换实例分析
May 11 Python
pygame实现俄罗斯方块游戏
Jun 26 Python
python 常用的基础函数
Jul 10 Python
使用python对excle和json互相转换的示例
Oct 23 Python
Django为窗体加上防机器人的验证码功能过程解析
Aug 14 Python
Python3.7 读取 mp3 音频文件生成波形图效果
Nov 05 Python
Python 中使用 PyMySQL模块操作数据库的方法
Nov 10 Python
判断Threading.start新线程是否执行完毕的实例
May 02 Python
2021年的Python 时间轴和即将推出的功能详解
Jul 27 Python
python+requests实现接口测试的完整步骤
Oct 27 Python
python图片合成的示例
Nov 09 Python
10个python爬虫入门基础代码实例 + 1个简单的python爬虫完整实例
Dec 16 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+MSSQL分页的例子
2006/10/09 PHP
dedecms中常见问题修改方法总结
2007/03/21 PHP
php gzip压缩输出的实现方法
2013/04/27 PHP
php实现的Captcha验证码类实例
2014/09/22 PHP
完美解决thinkphp唯一索引重复时出错的问题
2017/03/31 PHP
Javascript常用运算符(Operators)-javascript基础教程
2007/12/14 Javascript
javascript 表单的友好用户体现
2009/01/07 Javascript
jQuery实现鼠标滑过点击事件音效试听
2015/08/31 Javascript
基于jQuery实现带动画效果超炫酷的弹出对话框(附源码下载)
2016/02/22 Javascript
JavaScript实现图片滑动切换的代码示例分享
2016/03/06 Javascript
Vue.js 和 MVVM 的注意事项
2016/11/07 Javascript
js实现彩色条纹滚动条效果
2017/03/15 Javascript
Mui使用jquery并且使用点击跳转新窗口的实例
2017/08/19 jQuery
解决iView中时间控件选择的时间总是少一天的问题
2018/03/15 Javascript
[02:15]2015国际邀请赛选手档案IG.Ferrari 430
2015/07/30 DOTA
Python中property属性实例解析
2018/02/10 Python
python dataframe 输出结果整行显示的方法
2018/06/14 Python
PyTorch读取Cifar数据集并显示图片的实例讲解
2018/07/27 Python
Python 给某个文件名添加时间戳的方法
2018/10/16 Python
python3+PyQt5 实现Rich文本的行编辑方法
2019/06/17 Python
基于 Django 的手机管理系统实现过程详解
2019/08/16 Python
使用Python实现正态分布、正态分布采样
2019/11/20 Python
Python3基于print打印带颜色字符串
2020/07/06 Python
python opencv pytesseract 验证码识别的实现
2020/08/28 Python
python 贪心算法的实现
2020/09/18 Python
css3实现元素环绕中心点布局的方法示例
2019/01/15 HTML / CSS
Schecker荷兰:狗狗用品和配件
2019/06/06 全球购物
中海讯通笔试题
2015/09/15 面试题
销售会计工作职责
2013/12/02 职场文书
关于感恩的演讲稿200字
2014/08/26 职场文书
新学期红领巾广播稿
2014/10/04 职场文书
党校党性分析材料
2014/12/19 职场文书
2015年行政执法工作总结
2015/05/23 职场文书
时尚女魔头观后感
2015/06/04 职场文书
《巨人的花园》教学反思
2016/02/19 职场文书
php双向队列实例讲解
2021/11/17 PHP