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之print详解
Sep 28 Python
Windows安装Python、pip、easy_install的方法
Mar 05 Python
Python3爬虫学习之爬虫利器Beautiful Soup用法分析
Dec 12 Python
Python可视化mhd格式和raw格式的医学图像并保存的方法
Jan 24 Python
Django时区详解
Jul 24 Python
python自动化工具之pywinauto实例详解
Aug 26 Python
在pycharm中显示python画的图方法
Aug 31 Python
python3常用的数据清洗方法(小结)
Oct 31 Python
python取均匀不重复的随机数方式
Nov 27 Python
pytorch 实现模型不同层设置不同的学习率方式
Jan 06 Python
python 装饰器的使用示例
Oct 10 Python
安装python依赖包psycopg2来调用postgresql的操作
Jan 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 的 __FILE__ 常量
2007/01/15 PHP
PHP实现创建微信自定义菜单的方法示例
2017/07/14 PHP
Yii框架页面渲染操作实例详解
2019/07/19 PHP
PHP7新特性
2021/03/09 PHP
onpropertypchange
2006/07/01 Javascript
浅析javascript中的事件代理
2015/11/06 Javascript
Js实现简单的小球运动特效
2016/02/18 Javascript
基于Bootstrap+jQuery.validate实现表单验证
2016/05/30 Javascript
jQuery EasyUI Tab 选项卡问题小结
2016/08/16 Javascript
js学习总结之dom2级事件基础知识详解
2017/07/27 Javascript
vue+vuex+axios+echarts画一个动态更新的中国地图的方法
2017/12/19 Javascript
jQuery点击页面其他部分隐藏下拉菜单功能
2018/11/27 jQuery
vue 双向数据绑定的实现学习之监听器的实现方法
2018/11/30 Javascript
Jquery遍历筛选数组的几种方法和遍历解析json对象,Map()方法详解以及数组中查询某值是否存在
2019/01/18 jQuery
ES6基础之展开语法(Spread syntax)
2019/02/21 Javascript
js找出5个数中最大的一个数和倒数第二大的数实现方法示例小结
2020/03/04 Javascript
Vue watch响应数据实现方法解析
2020/07/10 Javascript
[02:10]2018DOTA2亚洲邀请赛赛前采访-Liquid
2018/04/03 DOTA
关于Python面向对象编程的知识点总结
2017/02/14 Python
Python 2.x如何设置命令执行的超时时间实例
2017/10/19 Python
Python使用matplotlib绘制三维图形示例
2018/08/25 Python
python如何删除文件、目录
2020/06/23 Python
Python lambda表达式原理及用法解析
2020/08/18 Python
GUESS盖尔斯法国官网:美国时尚品牌
2016/09/23 全球购物
Ruby中的保护方法和私有方法与一般面向对象程序设计语言的一样吗
2013/05/01 面试题
考试违纪检讨书
2014/02/02 职场文书
关爱留守儿童倡议书
2014/04/15 职场文书
倡议书范文
2014/04/16 职场文书
高等学院职业生涯规划书范文
2014/09/16 职场文书
幼儿园学前班幼儿评语
2014/12/29 职场文书
2015年法律事务部工作总结
2015/07/27 职场文书
职业生涯规划书之大学四年
2019/08/07 职场文书
JS不要再到处使用绝对等于运算符了
2021/04/30 Javascript
pandas DataFrame.shift()函数的具体使用
2021/05/24 Python
python可视化分析绘制带趋势线的散点图和边缘直方图
2022/06/25 Python
win10输入法不见了只能打出字母怎么解决?
2022/08/05 数码科技