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求解平方根的方法
Mar 11 Python
Python文档生成工具pydoc使用介绍
Jun 02 Python
Python爬虫之模拟知乎登录的方法教程
May 25 Python
Python批量提取PDF文件中文本的脚本
Mar 14 Python
Python设计模式之职责链模式原理与用法实例分析
Jan 11 Python
pyqt 实现在Widgets中显示图片和文字的方法
Jun 13 Python
Flask框架学习笔记之表单基础介绍与表单提交方式
Aug 12 Python
python每5分钟从kafka中提取数据的例子
Dec 23 Python
Python 使用 prettytable 库打印表格美化输出功能
Dec 26 Python
Python3 获取文件属性的方式(时间、大小等)
Mar 12 Python
Python爬虫代理池搭建的方法步骤
Sep 28 Python
pandas将list数据拆分成行或列的实现
Dec 13 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
Excel数据导入Mysql数据库的实现代码
2008/06/05 PHP
php 变量定义方法
2009/06/14 PHP
PHP中数组合并的两种方法及区别介绍
2012/09/14 PHP
Yii框架中jquery表单验证插件用法示例
2016/10/18 PHP
浅谈Laravel核心解读之Console内核
2018/12/02 PHP
解决php写入数据库乱码的问题
2019/09/17 PHP
Apache+PHP+MySQL搭建PHP开发环境图文教程
2020/08/06 PHP
jQuery checkbox全选/取消全选实现代码
2009/11/14 Javascript
jquery统计复选框选中示例
2013/11/05 Javascript
JavaScript获取对象在页面中位置坐标的方法
2016/02/03 Javascript
JS实现页面打印功能
2017/03/16 Javascript
Angular directive递归实现目录树结构代码实例
2017/05/05 Javascript
基于Vue的移动端图片裁剪组件功能
2017/11/28 Javascript
vue实现图片加载完成前的loading组件方法
2018/02/05 Javascript
vue中实现methods一个方法调用另外一个方法
2018/02/08 Javascript
原生js实现淘宝放大镜效果
2020/10/28 Javascript
实现高性能javascript的注意事项
2019/05/27 Javascript
如何正确理解vue中的key详解
2019/11/02 Javascript
js+canvas实现纸牌游戏
2020/03/16 Javascript
vue 解决uglifyjs-webpack-plugin打包出现报错的问题
2020/08/04 Javascript
[01:25:09]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第二场
2014/05/24 DOTA
python MySQLdb Windows下安装教程及问题解决方法
2015/05/09 Python
spark dataframe 将一列展开,把该列所有值都变成新列的方法
2019/01/29 Python
python装饰器简介---这一篇也许就够了(推荐)
2019/04/01 Python
Python QTimer实现多线程及QSS应用过程解析
2020/07/11 Python
Python txt文件如何转换成字典
2020/11/03 Python
python math模块的基本使用教程
2021/01/16 Python
Python实现一个论文下载器的过程
2021/01/18 Python
Python中的流程控制详解
2021/02/18 Python
HTML5中canvas中的beginPath()和closePath()的重要性
2018/08/24 HTML / CSS
优秀毕业生自我鉴定
2014/01/19 职场文书
法制宣传标语集锦
2014/06/25 职场文书
大学考试作弊检讨书
2015/05/06 职场文书
2015年网管个人工作总结
2015/05/22 职场文书
赵氏孤儿观后感
2015/06/09 职场文书
详解Oracle数据库中自带的所有表结构(sql代码)
2021/11/20 Oracle