Python猴子补丁知识点总结


Posted in Python onJanuary 05, 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 urllib模块urlopen()与urlretrieve()详解
Nov 01 Python
wxPython窗口中文乱码解决方法
Oct 11 Python
Python多线程编程(二):启动线程的两种方法
Apr 05 Python
Python中返回字典键的值的values()方法使用
May 22 Python
深入讲解Python中的迭代器和生成器
Oct 26 Python
Python利用IPython提高开发效率
Aug 10 Python
利用python求相邻数的方法示例
Aug 18 Python
解决pandas中读取中文名称的csv文件报错的问题
Jul 04 Python
Python中xml和json格式相互转换操作示例
Dec 05 Python
Python3 读取Word文件方式
Feb 13 Python
如何基于Python爬取隐秘的角落评论
Jul 02 Python
matplotlib图例legend语法及设置的方法
Jul 28 Python
Python调用Windows API函数编写录音机和音乐播放器功能
Jan 05 #Python
django ajax发送post请求的两种方法
Jan 05 #Python
关于tensorflow的几种参数初始化方法小结
Jan 04 #Python
基于TensorFlow常量、序列以及随机值生成实例
Jan 04 #Python
Tensorflow 实现分批量读取数据
Jan 04 #Python
Tensorflow的常用矩阵生成方式
Jan 04 #Python
Tensorflow读取并输出已保存模型的权重数值方式
Jan 04 #Python
You might like
php记录代码执行时间(实现代码)
2013/07/05 PHP
将php数组输出html表格的方法
2014/02/24 PHP
php使用多个进程同时控制文件读写示例
2014/02/28 PHP
Laravel框架使用monolog_mysql实现将系统日志信息保存到mysql数据库的方法
2018/08/16 PHP
原创javascript小游戏实现代码
2010/08/19 Javascript
eval的两组性能测试数据
2012/08/17 Javascript
JS中的数组的sort方法使用示例
2014/01/22 Javascript
深入理解JavaScript 函数
2016/06/06 Javascript
jQuery+Cookie实现切换皮肤功能【附源码下载】
2018/03/25 jQuery
微信小程序自定义select下拉选项框组件的实现代码
2018/08/28 Javascript
Node.js API详解之 util模块用法实例分析
2020/05/09 Javascript
Element实现表格嵌套、多个表格共用一个表头的方法
2020/05/09 Javascript
Vue按时间段查询数据组件使用详解
2020/08/21 Javascript
[07:40]DOTA2每周TOP10 精彩击杀集锦vol.4
2014/06/25 DOTA
[50:48]LGD vs CHAOS 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python输出由1,2,3,4组成的互不相同且无重复的三位数
2018/02/01 Python
Python爬虫包BeautifulSoup异常处理(二)
2018/06/17 Python
python抖音表白程序源代码
2019/04/07 Python
Python 转换文本编码实现解析
2019/08/27 Python
Python调用飞书发送消息的示例
2020/11/10 Python
一款纯css3实现的圆形旋转分享按钮旋转角度可自己调整
2014/09/02 HTML / CSS
iPhoneX安全区域(Safe Area)底部小黑条在微信小程序和H5的屏幕适配
2020/04/08 HTML / CSS
澳大利亚便宜的家庭购物网站:CrazySales
2018/02/06 全球购物
意大利咖啡、浓缩咖啡和浓缩咖啡机:illy caffe
2019/03/20 全球购物
vue项目实现分页效果
2021/03/24 Vue.js
师范学院毕业生求职信范文
2013/12/26 职场文书
趣味体育活动方案
2014/02/08 职场文书
职务说明书范文
2014/05/07 职场文书
年终考核实施方案
2014/05/26 职场文书
运动会开幕词
2015/01/28 职场文书
2015年学校工作总结范文
2015/04/20 职场文书
幼儿园小班开学寄语
2015/05/27 职场文书
将Python代码打包成.exe可执行文件的完整步骤
2021/05/12 Python
pytorch 权重weight 与 梯度grad 可视化操作
2021/06/05 Python
「天才王子的赤字国家重生术」妮妮姆·拉雷粘土人开订
2022/03/21 日漫
Win11远程连接不上怎么办?Win11远程桌面用不了的解决方法
2022/08/05 数码科技