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计算三角函数之acos()方法的使用
May 15 Python
Django Admin实现上传图片校验功能
Mar 06 Python
Python 比较两个数组的元素的异同方法
Aug 17 Python
Python PyQt5实现的简易计算器功能示例
Aug 23 Python
Python爬虫框架Scrapy基本用法入门教程
Jul 26 Python
python利用ffmpeg进行录制屏幕的方法
Jan 10 Python
python常用库之NumPy和sklearn入门
Jul 11 Python
利用scikitlearn画ROC曲线实例
Jul 02 Python
Python RabbitMQ实现简单的进程间通信示例
Jul 02 Python
Python pickle模块常用方法代码实例
Oct 10 Python
python获得命令行输入的参数的两种方式
Nov 02 Python
如何使用python-opencv批量生成带噪点噪线的数字验证码
Dec 21 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函数之error_reporting(E_ALL ^ E_NOTICE)详细说明
2011/07/01 PHP
PHP 获取文件路径(灵活应用__FILE__)
2013/02/15 PHP
邮箱正则表达式实现代码(针对php)
2013/06/21 PHP
php指定函数参数默认值示例代码
2013/12/04 PHP
PHP开发中常见的安全问题详解和解决方法(如Sql注入、CSRF、Xss、CC等)
2014/04/21 PHP
PHP中创建和验证哈希的简单方法实探
2015/07/06 PHP
js实现兼容IE6与IE7的DIV高度
2010/05/13 Javascript
javascript将数组插入到另一个数组中的代码
2013/01/10 Javascript
javascript实现移动端上的触屏拖拽功能
2016/03/04 Javascript
JavaScript中对象的不同创建方法
2016/08/12 Javascript
js 转json格式的字符串为对象或数组(前后台)的方法
2016/11/02 Javascript
微信小程序 Windows2008 R2服务器配置TLS1.2方法
2016/12/05 Javascript
Vue.js实现图片的随意拖动方法
2018/03/08 Javascript
Angular7中创建组件/自定义指令/管道的方法实例详解
2019/04/02 Javascript
vue子传父关于.sync与$emit的实现
2019/11/05 Javascript
node.JS事件机制与events事件模块的使用方法详解
2020/02/06 Javascript
vue监听滚动事件的方法
2020/12/21 Vue.js
[02:26]2016国际邀请赛8月3日开战 中国军团出征西雅图
2016/08/02 DOTA
python网页请求urllib2模块简单封装代码
2014/02/07 Python
python安装cx_Oracle模块常见问题与解决方法
2017/02/21 Python
python实现树形打印目录结构
2018/03/29 Python
OpenCV+python手势识别框架和实例讲解
2018/08/03 Python
解决pycharm 误删掉项目文件的处理方法
2018/10/22 Python
Python3.5 Pandas模块之Series用法实例分析
2019/04/23 Python
numpy中三维数组中加入元素后的位置详解
2019/11/28 Python
Python结合Window计划任务监测邮件的示例代码
2020/08/05 Python
pycharm2020.2 配置使用的方法详解
2020/09/16 Python
Python爬虫获取op.gg英雄联盟英雄对位胜率的源码
2021/01/29 Python
css3 给页面加个半圆形导航条主要利用旋转和倾斜样式
2014/02/10 HTML / CSS
早晨薰衣草在线女性精品店:Morning Lavender
2021/01/04 全球购物
青年文明号复核材料
2014/02/11 职场文书
先进个人自荐书
2015/03/06 职场文书
关爱留守儿童捐款倡议书
2015/04/27 职场文书
学校世界艾滋病日宣传活动总结
2015/05/05 职场文书
2015年银行信贷员工作总结
2015/05/19 职场文书
elasticSearch-api的具体操作步骤讲解
2021/06/28 Java/Android