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 内置函数filter
Jun 01 Python
Python之Scrapy爬虫框架安装及使用详解
Nov 16 Python
python实现学生信息管理系统
Apr 05 Python
Python中正则表达式的用法总结
Feb 22 Python
Django框架文件上传与自定义图片上传路径、上传文件名操作分析
May 10 Python
Python笔记之代理模式
Nov 20 Python
Python:二维列表下标互换方式(矩阵转置)
Dec 02 Python
如何使用Python破解ZIP或RAR压缩文件密码
Jan 09 Python
三步解决python PermissionError: [WinError 5]拒绝访问的情况
Apr 22 Python
Python faker生成器生成虚拟数据代码实例
Jul 20 Python
anaconda升级sklearn版本的实现方法
Feb 22 Python
浅析Python中的套接字编程
Jun 22 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多例模式介绍
2013/06/24 PHP
解密ThinkPHP3.1.2版本之模块和操作映射
2014/06/19 PHP
php使用文本统计访问量的方法
2016/05/12 PHP
PHP中类属性与类静态变量的访问方法示例
2016/07/13 PHP
php版微信返回用户text输入的方法
2016/11/14 PHP
关于PHP5.6+版本“No input file specified”问题的解决
2019/12/11 PHP
Thinkphp 框架扩展之Widget扩展实现方法分析
2020/04/23 PHP
运用jquery实现table单双行不同显示并能单行选中
2009/07/25 Javascript
jquery trim() 功能源代码
2011/02/14 Javascript
JS图片切换的具体方法(带缩略图版)
2013/11/12 Javascript
基于jquery扩展漂亮的下拉框可以二次修改
2013/11/19 Javascript
Android中的jQuery:AQuery简介
2014/05/06 Javascript
无刷新上传文件并返回自定义值
2015/06/11 Javascript
Javascript中的Prototype到底是什么
2016/02/16 Javascript
vue 里面使用axios 和封装的示例代码
2017/09/01 Javascript
vue.js-div滚动条隐藏但有滚动效果的实现方法
2018/03/03 Javascript
详解webpack4多入口、多页面项目构建案例
2018/05/25 Javascript
在vue中使用axios实现post方式获取二进制流下载文件(实例代码)
2019/12/16 Javascript
python中pygame模块用法实例
2014/10/09 Python
Python脚本在Appium库上对移动应用实现自动化测试
2015/04/17 Python
python脚本设置超时机制系统时间的方法
2016/02/21 Python
详解字典树Trie结构及其Python代码实现
2016/06/03 Python
Python实现在线暴力破解邮箱账号密码功能示例【测试可用】
2017/09/06 Python
利用Python如何将数据写到CSV文件中
2018/06/05 Python
PyQt5固定窗口大小的方法
2019/06/18 Python
解决python Jupyter不能导入外部包问题
2020/04/15 Python
详解Python中的编码问题(encoding与decode、str与bytes)
2020/09/30 Python
html5 canvas 简单画板实现代码
2012/01/05 HTML / CSS
澳大利亚电子产品购物网站:Dick Smith
2017/02/02 全球购物
BIBLOO波兰:捷克的一家在线服装店
2018/03/09 全球购物
新西兰床上用品和家居用品购物网站:Adairs
2018/04/27 全球购物
Diesel美国网上商店:意大利牛仔时装品牌
2020/12/10 全球购物
历史学专业推荐信
2013/11/06 职场文书
大学生学业生涯规划
2014/01/05 职场文书
淘宝文案策划岗位职责
2015/04/14 职场文书
python如何获取网络数据
2021/04/11 Python