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的Django框架下搭建的BLOG添加RSS功能的教程
Apr 08 Python
Python的time模块中的常用方法整理
Jun 18 Python
Python实现文件按照日期命名的方法
Jul 09 Python
python 与GO中操作slice,list的方式实例代码
Mar 20 Python
浅谈Python 的枚举 Enum
Jun 12 Python
Python面向对象基础入门之编码细节与注意事项
Dec 11 Python
在Python运行时动态查看进程内部信息的方法
Feb 22 Python
自适应线性神经网络Adaline的python实现详解
Sep 30 Python
基于python实现学生信息管理系统
Nov 22 Python
python pyenv多版本管理工具的使用
Dec 23 Python
解决pycharm安装第三方库失败的问题
May 09 Python
python如何从键盘获取输入实例
Jun 18 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调用数据库的存贮过程
2006/10/09 PHP
在PHP中使用反射技术的架构插件使用说明
2010/05/18 PHP
PHP面向对象三大特点学习(充分理解抽象、封装、继承、多态)
2012/05/07 PHP
php header功能的使用
2013/10/28 PHP
php获取url参数方法总结
2014/11/13 PHP
Gambit vs ForZe BO3 第二场 2.13
2021/03/10 DOTA
Jquery 弹出层插件实现代码
2009/10/24 Javascript
MooBox 基于Mootools的对话框插件
2012/01/20 Javascript
等待指定时间后自动跳转或关闭当前页面的js代码
2013/07/09 Javascript
Jquery性能优化详解
2014/05/15 Javascript
JS返回iframe中frameBorder属性值的方法
2015/04/01 Javascript
EasyUI闪屏EasyUI页面加载提示(原理+代码+效果图)
2016/02/21 Javascript
javascript鼠标滑过显示二级菜单特效
2020/11/18 Javascript
使用smartupload组件实现jsp+jdbc上传下载文件实例解析
2017/01/05 Javascript
vue2组件实现懒加载浅析
2017/03/29 Javascript
js获取一组日期中最近连续的天数
2017/05/25 Javascript
Angular5中提取公共组件之radio list的实例代码
2018/07/10 Javascript
vue使用better-scroll实现下拉刷新、上拉加载
2018/11/23 Javascript
[03:17]2016完美“圣”典风云人物:冷冷专访
2016/12/08 DOTA
Python with用法实例
2015/04/14 Python
Python利用BeautifulSoup解析Html的方法示例
2017/07/30 Python
python实现图片批量压缩程序
2018/07/23 Python
Python随机生成身份证号码及校验功能
2018/12/04 Python
Python3 列表,数组,矩阵的相互转换的方法示例
2019/08/05 Python
简单介绍python封装的基本知识
2019/08/10 Python
Python selenium自动化测试模型图解
2020/04/15 Python
通过python调用adb命令对App进行性能测试方式
2020/04/23 Python
Pytorch 使用opnecv读入图像由HWC转为BCHW格式方式
2020/06/02 Python
python实现计算器简易版
2020/12/17 Python
英国最大的老式糖果店:A Quarter Of
2017/04/08 全球购物
迎接领导欢迎词
2014/01/11 职场文书
警示教育活动总结
2014/05/05 职场文书
学习方法演讲稿
2014/05/10 职场文书
横幅标语大全
2014/06/17 职场文书
七年级作文之《我和我的祖国》观后感作文
2019/10/18 职场文书
详解OpenCV曝光融合
2022/04/29 Python