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 14 Python
用Python操作字符串之rindex()方法的使用
May 19 Python
linux平台使用Python制作BT种子并获取BT种子信息的方法
Jan 20 Python
Python读取和处理文件后缀为.sqlite的数据文件(实例讲解)
Jun 27 Python
Python模拟用户登录验证
Sep 11 Python
详解如何为eclipse安装合适版本的python插件pydev
Nov 04 Python
对python的输出和输出格式详解
Dec 08 Python
利用python开发app实战的方法
Jul 09 Python
OpenCV3.0+Python3.6实现特定颜色的物体追踪
Jul 23 Python
python安装本地whl的实例步骤
Oct 12 Python
使用pandas 将DataFrame转化成dict
Dec 10 Python
python如何遍历指定路径下所有文件(按按照时间区间检索)
Sep 14 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中执行系统外部命令
2006/10/09 PHP
基于PHP编程注意事项的小结
2013/04/27 PHP
php时间戳格式化显示友好的时间函数分享
2014/10/21 PHP
php swoft框架实例用法
2020/12/22 PHP
JavaScript 布尔操作符解析  && || !
2012/08/10 Javascript
javascript生成随机数的方法
2014/05/16 Javascript
使用jQuery实现星级评分代码分享
2014/12/09 Javascript
JavaScript中使用Math.floor()方法对数字取整
2015/06/15 Javascript
Hallo.js基于jQuery UI所见即所得的Web编辑器
2016/01/26 Javascript
Bootstrap carousel轮转图的使用实例详解
2016/05/17 Javascript
jquery获取复选框的值的简单实例
2016/05/26 Javascript
js 自带的 map() 方法全面了解
2016/08/16 Javascript
jquery实现ajax提交表单信息的简单方法(推荐)
2016/08/24 Javascript
vue首次赋值不触发watch的解决方法
2018/09/11 Javascript
解决IE11 vue +webpack 项目中数据更新后页面没有刷新的问题
2018/09/25 Javascript
JS控制下拉列表左右选择实例代码
2020/05/08 Javascript
vue 使用async写数字动态加载效果案例
2020/07/18 Javascript
将图片文件嵌入到wxpython代码中的实现方法
2014/08/11 Python
使用70行Python代码实现一个递归下降解析器的教程
2015/04/17 Python
Python过滤列表用法实例分析
2016/04/29 Python
python好玩的项目—色情图片识别代码分享
2017/11/07 Python
python验证码识别教程之利用滴水算法分割图片
2018/06/05 Python
Django压缩静态文件的实现方法详析
2018/08/26 Python
Python flask框架post接口调用示例
2019/07/03 Python
Python read函数按字节(字符)读取文件的实现
2019/07/03 Python
python 实现识别图片上的数字
2019/07/30 Python
Python 经典算法100及解析(小结)
2019/09/13 Python
美国专营婴幼儿用品的购物网站:buybuy BABY
2017/01/01 全球购物
美国智能家居专家:tink
2019/06/04 全球购物
德国净水壶和滤芯品牌:波尔德PearlCo(家用净水器)
2020/04/29 全球购物
英国马莎百货印度官网:Marks & Spencer印度
2020/10/08 全球购物
银行毕业实习自我鉴定
2013/09/19 职场文书
公司优秀员工获奖感言
2014/08/14 职场文书
先进个人申报材料
2014/12/30 职场文书
Flutter集成高德地图并添加自定义Maker的实践
2022/04/07 Java/Android