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中super的用法实例
May 28 Python
关于Python中Inf与Nan的判断问题详解
Feb 08 Python
Python计时相关操作详解【time,datetime】
May 26 Python
Python3多线程爬虫实例讲解代码
Jan 05 Python
win7 x64系统中安装Scrapy的方法
Nov 18 Python
对python周期性定时器的示例详解
Feb 19 Python
python爬取内容存入Excel实例
Feb 20 Python
python自动化测试之异常及日志操作实例分析
Nov 09 Python
python 消费 kafka 数据教程
Dec 21 Python
浅谈tensorflow中Dataset图片的批量读取及维度的操作详解
Jan 20 Python
pyspark 随机森林的实现
Apr 24 Python
python中random模块详解
Mar 01 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 session机制
2011/07/17 PHP
Laravel5.5新特性之友好报错以及展示详解
2017/08/13 PHP
php 策略模式原理与应用深入理解
2019/09/25 PHP
JavaScript中Math对象使用说明
2008/01/16 Javascript
(跨浏览器基础事件/浏览器检测/判断浏览器)经验代码分享
2013/01/24 Javascript
JavaScript中输出标签的方法
2014/08/27 Javascript
使用jQuery和Bootstrap实现多层、自适应模态窗口
2014/12/22 Javascript
js判断登录与否并确定跳转页面的方法
2015/01/30 Javascript
jquery实现的点击翻书效果代码
2015/11/04 Javascript
每天一篇javascript学习小结(String对象)
2015/11/18 Javascript
javascript中数组和字符串的方法对比
2016/07/20 Javascript
Javascript从数组中随机取出不同元素的两种方法
2016/09/22 Javascript
ES5 ES6中Array对象去除重复项的方法总结
2017/04/27 Javascript
Vue中如何实现轮播图的示例代码
2017/07/27 Javascript
Vue+Vux项目实践完整代码
2017/11/30 Javascript
10分钟彻底搞懂Http的强制缓存和协商缓存(小结)
2018/08/30 Javascript
JavaScript中EventBus实现对象之间通信
2020/10/18 Javascript
Python利用splinter实现浏览器自动化操作方法
2018/05/11 Python
python async with和async for的使用
2019/06/20 Python
python中dict()的高级用法实现
2019/11/13 Python
Python如何读取、写入JSON数据
2020/07/28 Python
Html5新标签datalist实现输入框与后台数据库数据的动态匹配
2017/05/18 HTML / CSS
英国鲜花速递:Serenata Flowers
2018/04/03 全球购物
介绍一下Transact-SQL中SPACE函数的用法
2015/09/01 面试题
自我评价中英文语句
2013/11/30 职场文书
品质主管的岗位职责
2013/12/04 职场文书
英文简历自荐信范文
2013/12/11 职场文书
中学实习教师自我鉴定
2013/12/12 职场文书
团工委书记自荐书范文
2013/12/17 职场文书
自我鉴定 电子商务专业
2014/01/30 职场文书
小学生学雷锋演讲稿
2014/04/25 职场文书
交通工程专业推荐信
2014/09/06 职场文书
政协会议宣传标语
2014/10/09 职场文书
交心谈心活动总结
2015/05/11 职场文书
初中团支书竞选稿
2015/11/21 职场文书
Java 垃圾回收超详细讲解记忆集和卡表
2022/04/08 Java/Android