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中操作MySQL入门实例
Feb 08 Python
使用Django Form解决表单数据无法动态刷新的两种方法
Jul 14 Python
Python实现购物车购物小程序
Apr 18 Python
python3+PyQt5实现拖放功能
Apr 24 Python
Python unittest模块用法实例分析
May 25 Python
Python tkinter的grid布局及Text动态显示方法
Oct 11 Python
django框架事务处理小结【ORM 事务及raw sql,customize sql 事务处理】
Jun 27 Python
Python PIL读取的图像发生自动旋转的实现方法
Jul 05 Python
解决在pycharm运行代码,调用CMD窗口的命令运行显示乱码问题
Aug 23 Python
Python爬虫爬取Bilibili弹幕过程解析
Oct 10 Python
利用Python实现朋友圈中的九宫格图片效果
Sep 03 Python
利用python做数据拟合详情
Nov 17 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的魔术常量__METHOD__简介
2014/07/08 PHP
Yii2框架引用bootstrap中日期插件yii2-date-picker的方法
2016/01/09 PHP
PHP基于ICU扩展intl快速实现汉字转拼音及按拼音首字母分组排序的方法
2017/05/03 PHP
Yii 访问 Gii(脚手架)时出现 403 错误
2018/06/06 PHP
实例介绍PHP中zip_open()函数用法
2019/02/15 PHP
[原创]图片分页查看
2006/08/28 Javascript
textarea中的手动换行处理的jquery代码
2011/02/26 Javascript
JS 屏蔽键盘不可用与鼠标右键不可用的方法
2013/11/18 Javascript
javascript字符串函数汇总
2015/12/06 Javascript
类似于QQ的右滑删除效果的实现方法
2016/10/16 Javascript
Java  Spring 事务回滚详解
2016/10/17 Javascript
搭建Bootstrap离线文档的方法
2016/12/02 Javascript
微信小程序 实战实例开发流程详细介绍
2017/01/05 Javascript
vue中用动态组件实现选项卡切换效果
2017/03/25 Javascript
浅谈Angular2 模块懒加载的方法
2017/10/04 Javascript
layui radio性别单选框赋值方法
2018/08/15 Javascript
vueJs实现DOM加载完之后自动下拉到底部的实例代码
2018/08/31 Javascript
Nodejs调用Dll模块的方法
2018/09/17 NodeJs
详解vue页面首次加载缓慢原因及解决方案
2019/11/06 Javascript
微信小程序监听用户登录事件的实现方法
2019/11/11 Javascript
Vue组件化开发之通用型弹出框的实现
2020/02/28 Javascript
[02:08]什么藏在DOTA2 TI9“小紫本”里?斧王历险记告诉你!
2019/05/17 DOTA
python操作日期和时间的方法
2014/03/11 Python
详解python的数字类型变量与其方法
2016/11/20 Python
python 捕获shell脚本的输出结果实例
2017/01/04 Python
Python命名空间namespace及作用域原理解析
2020/06/05 Python
全球领先的全景影像品牌:Insta360
2019/08/21 全球购物
Prototype如何实现页面局部定时刷新
2013/08/06 面试题
安全承诺书范文
2014/03/26 职场文书
药品业务员岗位职责
2014/04/17 职场文书
党员廉洁自律承诺书
2014/05/26 职场文书
单位委托书怎么写
2014/09/21 职场文书
2014年转正工作总结
2014/11/08 职场文书
有关保护环境的宣传标语100条
2019/08/07 职场文书
磁贴还没死, 微软Win11可修改注册表找回Win10开始菜单
2021/11/21 数码科技
Python jiaba库的使用详解
2021/11/23 Python