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中利用函数装饰器实现备忘功能
Mar 30 Python
利用python程序帮大家清理windows垃圾
Jan 15 Python
Python中进程和线程的区别详解
Oct 29 Python
学习python中matplotlib绘图设置坐标轴刻度、文本
Feb 07 Python
matplotlib subplots 调整子图间矩的实例
May 25 Python
Python 中的range(),以及列表切片方法
Jul 02 Python
零基础使用Python读写处理Excel表格的方法
May 02 Python
使用python远程操作linux过程解析
Dec 04 Python
Python 一行代码能实现丧心病狂的功能
Jan 18 Python
python opencv pytesseract 验证码识别的实现
Aug 28 Python
Django如何实现防止XSS攻击
Oct 13 Python
python 实现ping测试延迟的两种方法
Dec 10 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
如何选购合适的收音机
2021/03/01 无线电
用libtemplate实现静态网页生成
2006/10/09 PHP
用PHPdig打造属于你自己的Google[图文教程]
2007/02/14 PHP
php error_log 函数的使用
2009/04/13 PHP
收集的二十一个实用便利的PHP函数代码
2010/04/22 PHP
php强大的时间转换函数strtotime
2016/02/18 PHP
判断目标是否是window,document,和拥有tagName的Element的代码
2010/05/31 Javascript
JS 仿腾讯发表微博的效果代码
2013/12/25 Javascript
js中的onchange和onpropertychange (onchange无效的解决方法)
2014/03/08 Javascript
NodeJS使用jQuery选择器操作DOM
2015/02/13 NodeJs
js正则表达式验证邮件地址
2015/11/12 Javascript
Angularjs中的页面访问权限怎么设置
2016/11/11 Javascript
jQuery元素选择器实例代码
2017/02/06 Javascript
微信小程序 自动登陆PHP源码实例(源码下载)
2017/05/08 Javascript
关于angularJs清除浏览器缓存的方法
2017/11/28 Javascript
vue 使某个组件不被 keep-alive 缓存的方法
2018/09/21 Javascript
Vue + Elementui实现多标签页共存的方法
2019/06/12 Javascript
微信小程序 WXML节点信息查询详解
2019/07/29 Javascript
JavaScript算法学习之冒泡排序和选择排序
2019/11/02 Javascript
[01:56]林书豪DOTA2上海特级锦标赛励志短片
2016/03/05 DOTA
Python计算程序运行时间的方法
2014/12/13 Python
Python实现简单的多任务mysql转xml的方法
2017/02/08 Python
Python编写Windows Service服务程序
2018/01/04 Python
解决Mac下首次安装pycharm无project interpreter的问题
2018/10/29 Python
python文件拆分与重组实例
2018/12/10 Python
Tensorflow实现多GPU并行方式
2020/02/03 Python
解决TensorFlow程序无限制占用GPU的方法
2020/06/30 Python
基于Python编写一个计算器程序,实现简单的加减乘除和取余二元运算
2020/08/05 Python
美国时尚孕妇装品牌:A Pea in the Pod
2017/07/16 全球购物
英国绿色商店:Natural Collection
2019/05/03 全球购物
商务助理岗位职责
2013/11/13 职场文书
投标授权委托书范文
2014/08/02 职场文书
幼儿园校园小喇叭广播稿
2014/10/17 职场文书
2014年法院个人工作总结
2014/12/17 职场文书
MySQL空间数据存储及函数
2021/09/25 MySQL
Mysql 一主多从的部署
2022/05/20 MySQL