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 10 Python
Python 随机生成中文验证码的实例代码
Mar 20 Python
Python中处理字符串之endswith()方法的使用简介
May 18 Python
使用C#配合ArcGIS Engine进行地理信息系统开发
Feb 19 Python
python中模块查找的原理与方法详解
Aug 11 Python
Python实现句子翻译功能
Nov 14 Python
Python异常处理操作实例详解
Aug 28 Python
python实现石头剪刀布小游戏
Jan 20 Python
Python分布式进程中你会遇到的问题解析
May 28 Python
python 获取sqlite3数据库的表名和表字段名的实例
Jul 17 Python
利用Python的turtle库绘制玫瑰教程
Nov 23 Python
Python求平面内点到直线距离的实现
Jan 19 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 zlib压缩和解压缩swf文件的代码
2008/12/30 PHP
php mssql 分页SQL语句优化 持续影响
2009/04/26 PHP
PHP实现验证码校验功能
2017/11/16 PHP
php使用array_chunk函数将一个数组分割成多个数组
2018/12/05 PHP
PHP读取文件,解决中文乱码UTF-8的方法分析
2020/01/22 PHP
JavaScript中几种常见排序算法小结
2011/02/22 Javascript
seajs中模块的解析规则详解和模块使用总结
2014/03/12 Javascript
js使用栈来实现10进制转8进制与取除数及余数
2014/06/11 Javascript
jquery分页插件jquery.pagination.js实现无刷新分页
2016/04/01 Javascript
JScript实现表格的简单操作
2017/08/15 Javascript
JS 仿支付宝input文本输入框放大组件的实例
2017/11/14 Javascript
详解webpack require.ensure与require AMD的区别
2017/12/13 Javascript
详解Vue 事件修饰符capture 的使用
2017/12/29 Javascript
jQuery实现浏览器之间跳转并传递参数功能【支持中文字符】
2018/03/28 jQuery
小程序tab页无法传递参数的方法
2018/08/03 Javascript
微信小程序使用swiper组件实现类3D轮播图
2018/08/29 Javascript
详细分析vue表单数据的绑定
2020/07/20 Javascript
vue自定义指令和动态路由实现权限控制
2020/08/28 Javascript
[07:09]2014DOTA2国际邀请赛-Newbee再次发威成功晋级决赛
2014/07/19 DOTA
Python分治法定义与应用实例详解
2017/07/28 Python
用python处理图片之打开\显示\保存图像的方法
2018/05/04 Python
Python单元测试unittest的具体使用示例
2018/12/17 Python
基于Python中的yield表达式介绍
2019/11/19 Python
Python批量安装卸载1000个apk的方法
2020/04/10 Python
python基于socket模拟实现ssh远程执行命令
2020/12/05 Python
CSS3.0实现霓虹灯按钮动画特效的示例代码
2021/01/12 HTML / CSS
简历自我评价模版
2014/01/31 职场文书
机关党员进社区活动总结
2014/07/05 职场文书
党的群众路线教育实践活动对照检查材料范文
2014/09/24 职场文书
总账会计岗位职责
2015/04/02 职场文书
应急管理工作总结2015
2015/05/04 职场文书
运动员入场前导词
2015/07/20 职场文书
2015初一年级组工作总结
2015/07/24 职场文书
关于五一放假的通知
2015/08/18 职场文书
历史名人教你十五个读书方法,赶快Get起来!
2019/07/18 职场文书
Python 类,对象,数据分类,函数参数传递详解
2021/09/25 Python