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中一些自然语言工具的使用的入门教程
Apr 13 Python
python的numpy模块安装不成功简单解决方法总结
Dec 23 Python
python中in在list和dict中查找效率的对比分析
May 04 Python
Python 实现两个列表里元素对应相乘的方法
Nov 14 Python
Python使用sklearn库实现的各种分类算法简单应用小结
Jul 04 Python
python实现图片九宫格分割
Mar 07 Python
Python队列RabbitMQ 使用方法实例记录
Aug 05 Python
python中for in的用法详解
Apr 17 Python
pytorch 查看cuda 版本方式
Jun 23 Python
解决运行django程序出错问题 'str'object has no attribute'_meta'
Jul 15 Python
Python 中的函数装饰器和闭包详解
Feb 06 Python
Python实现图片指定位置加图片水印(附Pyinstaller打包exe)
Mar 04 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 来访国内外IP判断代码并实现页面跳转
2009/12/18 PHP
深入php常用函数的使用汇总
2013/06/08 PHP
php遍历目录方法小结
2015/03/10 PHP
YII2.0之Activeform表单组件用法实例
2016/01/09 PHP
Symfony2安装第三方Bundles实例详解
2016/02/04 PHP
smarty中改进truncate使其支持中文的方法
2016/05/30 PHP
Yii2中YiiBase自动加载类、引用文件方法分析(autoload)
2016/07/25 PHP
功能强大的PHP发邮件类
2016/08/29 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
2017/11/10 PHP
PHP中SESSION过期设置
2021/03/09 PHP
根据一段代码浅谈Javascript闭包
2010/12/14 Javascript
通过Jquery的Ajax方法读取将table转换为Json
2014/05/31 Javascript
jquery用data方法获取某个元素上的事件
2014/06/23 Javascript
jQuery移动web开发之页面跳转和加载外部页面的实现
2015/12/04 Javascript
Vue实现动态显示textarea剩余字数
2017/05/22 Javascript
基于jquery.page.js实现分页效果
2018/01/01 jQuery
vue2.0 路由模式mode="history"的作用
2018/10/18 Javascript
一次Webpack配置文件的分离实战记录
2018/11/30 Javascript
jquery插件懒加载的示例
2020/10/24 jQuery
python数据类型_字符串常用操作(详解)
2017/05/30 Python
python抓取需要扫微信登陆页面
2019/04/29 Python
Python二进制文件读取并转换为浮点数详解
2019/06/25 Python
python中resample函数实现重采样和降采样代码
2020/02/25 Python
Python持续监听文件变化代码实例
2020/07/22 Python
HTML5里autofocus自动聚焦属性使用介绍
2016/06/22 HTML / CSS
Javascript 高级手势使用介绍
2013/04/21 HTML / CSS
机械化及自动化毕业生的自我评价分享
2013/11/06 职场文书
资源环境与城市管理专业推荐信
2013/11/30 职场文书
物业客服专员岗位职责
2013/11/30 职场文书
销售员岗位职责
2014/06/09 职场文书
2015年财务试用期工作总结
2014/12/24 职场文书
2015学习委员工作总结范文
2015/04/03 职场文书
刑事起诉书范文
2015/05/19 职场文书
2015年度环卫处工作总结
2015/07/24 职场文书
2016年综治和平安建设宣传月活动总结
2016/04/01 职场文书
解析mybatis-plus中的resultMap简单使用
2021/11/23 Java/Android