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 27 Python
浅谈Python 对象内存占用
Jul 15 Python
浅谈Python中带_的变量或函数命名
Dec 04 Python
python删除服务器文件代码示例
Feb 09 Python
利用Python+阿里云实现DDNS动态域名解析的方法
Apr 01 Python
Python 添加文件注释和函数注释操作
Aug 09 Python
详解python实现可视化的MD5、sha256哈希加密小工具
Sep 14 Python
如何使用python写截屏小工具
Sep 29 Python
python中pyplot基础图标函数整理
Nov 10 Python
Python使用tkinter制作在线翻译软件
Feb 22 Python
python装饰器代码深入讲解
Mar 01 Python
python3+PyQt5+Qt Designer实现界面可视化
Jun 10 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
shell脚本作为保证PHP脚本不挂掉的守护进程实例分享
2013/07/15 PHP
浅谈PHP中的错误处理和异常处理
2017/02/04 PHP
Yii2实现自定义独立验证器的方法
2017/05/05 PHP
PHP7移除的扩展和SAPI
2021/03/09 PHP
js中精确计算加法和减法示例
2014/03/28 Javascript
jquery实现焦点图片随机切换效果的方法
2015/03/12 Javascript
JavaScript获取DOM元素的11种方法总结
2015/04/25 Javascript
Bootstrap每天必学之弹出框(Popover)插件
2016/04/25 Javascript
简单实现js页面切换功能
2021/01/10 Javascript
js验证手机号、密码、短信验证码代码工具类
2020/06/24 Javascript
underscore之Collections_动力节点Java学院整理
2017/07/10 Javascript
基于node下的http小爬虫的示例代码
2018/01/11 Javascript
node.js通过axios实现网络请求的方法
2018/03/05 Javascript
深入剖析Node.js cluster模块
2018/05/23 Javascript
vue+vant-UI框架实现购物车的复选框全选和反选功能
2019/11/05 Javascript
微信小程序实现吸顶特效
2020/01/08 Javascript
js面向对象封装级联下拉菜单列表的实现步骤
2021/02/08 Javascript
python里将list中元素依次向前移动一位
2014/09/12 Python
Python利用IPython提高开发效率
2016/08/10 Python
Golang与python线程详解及简单实例
2017/04/27 Python
python 实现数组list 添加、修改、删除的方法
2018/04/04 Python
Python格式化输出%s和%d
2018/05/07 Python
在CMD命令行中运行python脚本的方法
2018/05/12 Python
使用Python获取网段IP个数以及地址清单的方法
2018/11/01 Python
python 通过SSHTunnelForwarder隧道连接redis的方法
2019/02/19 Python
解决pyPdf和pyPdf2在合并pdf时出现异常的问题
2020/04/03 Python
浅谈html5与APP混合开发遇到的问题总结
2018/03/20 HTML / CSS
HR喜欢的自荐信格式
2013/10/08 职场文书
学生实习介绍信
2014/01/15 职场文书
家长会演讲稿
2014/04/26 职场文书
优质服务活动实施方案
2014/05/02 职场文书
生物科学专业自荐书
2014/06/20 职场文书
国庆促销活动总结
2014/08/29 职场文书
宿舍管理制度范本
2015/08/07 职场文书
重阳节主题班会
2015/08/17 职场文书
科学家测试在太空中培育人造肉,用于未来太空旅行
2022/04/29 数码科技