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基础教程之基本内置数据类型介绍
Feb 20 Python
python从sqlite读取并显示数据的方法
May 08 Python
在Python中使用zlib模块进行数据压缩的教程
Jun 26 Python
Python书单 不将就
Jul 11 Python
tensorflow实现简单的卷积神经网络
May 24 Python
selenium+python实现自动化登录的方法
Sep 04 Python
Python列表切片操作实例总结
Feb 19 Python
用Anaconda安装本地python包的方法及路径问题(图文)
Jul 16 Python
jupyter notebook 多行输出实例
Apr 09 Python
使用Python对Dicom文件进行读取与写入的实现
Apr 20 Python
PIP和conda 更换国内安装源的方法步骤
Sep 21 Python
python 自定义异常和主动抛出异常(raise)的操作
Dec 11 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中文字母数字验证码实现代码
2008/04/25 PHP
PHP微信开发之有道翻译
2016/06/23 PHP
PHP异常处理定义与使用方法分析
2017/07/25 PHP
PHP错误提示It is not safe to rely on the system……的解决方法
2019/03/25 PHP
ie和firefox中img对象区别的困惑
2006/12/27 Javascript
javascript操作cookie的文章(设置,删除cookies)
2010/04/01 Javascript
jquery.ajax的url中传递中文乱码问题的解决方法
2014/02/07 Javascript
关于jQuery判断元素是否存在的问题示例探讨
2014/07/21 Javascript
浅析Bootstrap验证控件的使用
2016/06/23 Javascript
jQuery如何防止Ajax重复提交
2016/10/14 Javascript
BootStrap tooltip提示框使用小结
2016/10/26 Javascript
EasyUI学习之DataGird分页显示数据
2016/12/29 Javascript
js编写选项卡效果
2017/05/23 Javascript
vue页面使用阿里oss上传功能的实例(一)
2017/08/09 Javascript
axios使用拦截器统一处理所有的http请求的方法
2018/11/02 Javascript
Vue起步(无cli)的啊教程详解
2019/04/11 Javascript
es6中new.target的作用和使用场景简单示例分析
2020/03/14 Javascript
vue 监听窗口变化对页面部分元素重新渲染操作
2020/07/28 Javascript
js实现弹幕墙效果
2020/12/10 Javascript
python实现给字典添加条目的方法
2014/09/25 Python
Python上传package到Pypi(代码简单)
2016/02/06 Python
Django验证码的生成与使用示例
2017/05/20 Python
Bottle框架中的装饰器类和描述符应用详解
2017/10/28 Python
pandas表连接 索引上的合并方法
2018/06/08 Python
Python实现动态添加属性和方法操作示例
2018/07/25 Python
浅谈多卡服务器下隐藏部分 GPU 和 TensorFlow 的显存使用设置
2020/06/30 Python
HTML5 图片预加载的示例代码
2020/03/25 HTML / CSS
欧洲领先的火车票和大巴票预订平台:Trainline
2018/12/26 全球购物
英国排名第一的冲浪店:Ann’s Cottage
2020/06/21 全球购物
员工三分钟演讲稿
2014/08/19 职场文书
暑期培训心得体会
2014/09/02 职场文书
2015年元旦演讲稿
2014/09/12 职场文书
求职简历自荐信怎么写
2015/03/26 职场文书
SQLServer权限之只开启创建表权限
2022/04/12 SQL Server
win10电脑老是死机怎么办?win10系统老是死机的解决方法
2022/08/05 数码科技