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制作微信跳一跳辅助
Jan 31 Python
关于django 数据库迁移(migrate)应该知道的一些事
May 27 Python
python实现微信防撤回神器
Apr 29 Python
Django框架视图层URL映射与反向解析实例分析
Jul 29 Python
python爬虫 execjs安装配置及使用
Jul 30 Python
Python MongoDB 插入数据时已存在则不执行,不存在则插入的解决方法
Sep 24 Python
浅谈spring boot 集成 log4j 解决与logback冲突的问题
Feb 20 Python
jupyter修改文件名方式(TensorFlow)
Apr 21 Python
python函数map()和partial()的知识点总结
May 26 Python
Python调用Redis的示例代码
Nov 24 Python
selenium3.0+python之环境搭建的方法步骤
Feb 01 Python
Django migrate报错的解决方案
May 20 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和Mysqlweb应用开发核心技术 第1部分 Php基础-1 开始了解php
2011/07/03 PHP
PHP自定session保存路径及删除、注销与写入的方法
2014/11/18 PHP
php生成验证码,缩略图及水印图的类分享
2016/04/07 PHP
在PHP语言中使用JSON和将json还原成数组的方法
2016/07/19 PHP
利用jQuery 实现GridView异步排序、分页的代码
2010/02/06 Javascript
Extjs 3.3切换tab隐藏相应工具栏出现空白解决
2013/04/02 Javascript
使用JavaScript 实现对象 匀速/变速运动的方法
2013/05/08 Javascript
同域jQuery(跨)iframe操作DOM(示例代码)
2013/12/13 Javascript
javascript实现文本域写入字符时限定字数
2014/02/12 Javascript
JavaScript中使用arguments获得函数传参个数实例
2014/08/27 Javascript
使用jquery动态加载Js文件和Css文件
2015/10/24 Javascript
使用纯JS代码判断字符串中有多少汉字的实现方法(超简单实用)
2016/11/12 Javascript
bootstrap轮播图示例代码分享
2017/05/17 Javascript
基于JavaScript实现无缝滚动效果
2017/07/21 Javascript
详解vue axios中文文档
2017/09/12 Javascript
React学习笔记之高阶组件应用
2018/06/02 Javascript
小程序ios音频播放没声音问题的解决
2018/07/11 Javascript
Vue组件教程之Toast(Vue.extend 方式)详解
2019/01/27 Javascript
vue中格式化时间过滤器代码实例
2019/04/17 Javascript
Vue-cli3生成的Vue项目加载Mxgraph方法示例
2020/05/31 Javascript
JS实现手风琴特效
2020/11/08 Javascript
python with statement 进行文件操作指南
2014/08/22 Python
对Python进行数据分析_关于Package的安装问题
2017/05/22 Python
Python 二叉树的层序建立与三种遍历实现详解
2019/07/29 Python
pycharm配置当鼠标悬停时快速提示方法参数
2019/07/31 Python
通过python检测字符串的字母
2020/02/18 Python
使用sklearn对多分类的每个类别进行指标评价操作
2020/06/11 Python
如何用python批量调整视频声音
2020/12/22 Python
html5 touch事件实现触屏页面上下滑动(一)
2016/03/10 HTML / CSS
Lacoste美国官网:经典POLO衫品牌
2016/10/12 全球购物
StubHub哥伦比亚:购买和出售您的门票
2016/10/20 全球购物
农村葬礼主持词
2014/03/31 职场文书
优秀员工推荐材料
2014/12/20 职场文书
丧事答谢词
2015/01/05 职场文书
laravel ajax curd 搜索登录判断功能的实现
2021/04/17 PHP
MySQL慢查询优化解决问题
2022/03/17 MySQL