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开发之for循环操作实例详解
Nov 12 Python
Python Queue模块详细介绍及实例
Dec 27 Python
numpy中索引和切片详解
Dec 15 Python
python3+PyQt5泛型委托详解
Apr 24 Python
用python写扫雷游戏实例代码分享
May 27 Python
python实现整数的二进制循环移位
Mar 08 Python
Python的互斥锁与信号量详解
Sep 12 Python
Python Django2.0集成Celery4.1教程
Nov 19 Python
PyTorch中反卷积的用法详解
Dec 30 Python
使用TensorFlow直接获取处理MNIST数据方式
Feb 10 Python
Python之变量类型和if判断方式
May 05 Python
pycharm开发一个简单界面和通用mvc模板(操作方法图解)
May 27 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 进程锁定问题分析研究
2009/11/24 PHP
php中邮箱地址正则表达式实现与详解
2012/04/24 PHP
php设计模式之命令模式的应用详解
2013/05/21 PHP
PHP设计模式之命令模式的深入解析
2013/06/13 PHP
PHP+Mysql树型结构(无限分类)数据库设计的2种方式实例
2014/07/15 PHP
php中opendir函数用法实例
2014/11/15 PHP
php通过淘宝API查询IP地址归属等信息
2015/12/25 PHP
关于__defineGetter__ 和__defineSetter__的说明
2007/05/12 Javascript
RGB颜色值转HTML十六进制(HEX)代码的JS函数
2009/04/25 Javascript
jQuery 源码分析笔记(4) Ready函数
2011/06/02 Javascript
js的2种继承方式详解
2014/03/04 Javascript
js 日期比较相关天数代码
2014/04/02 Javascript
javascript实现的一个随机点名功能
2014/08/26 Javascript
谈谈基于iframe、FormData、FileReader三种无刷新上传文件的方法
2015/12/03 Javascript
详解AngularJS中自定义过滤器
2015/12/28 Javascript
基于JavaScript短信验证码如何实现
2016/01/24 Javascript
JavaScript中for循环的几种写法与效率总结
2017/02/03 Javascript
详解在Angularjs中ui-sref和$state.go如何传递参数
2017/04/24 Javascript
JavaScript函数式编程(Functional Programming)箭头函数(Arrow functions)用法分析
2019/05/22 Javascript
javascript(基于jQuery)实现鼠标获取选中的文字示例【测试可用】
2019/10/26 jQuery
Python中让MySQL查询结果返回字典类型的方法
2014/08/22 Python
详解Django通用视图中的函数包装
2015/07/21 Python
解决出现Incorrect integer value: '' for column 'id' at row 1的问题
2017/10/29 Python
详解pandas的外部数据导入与常用方法
2019/05/01 Python
浅谈对pytroch中torch.autograd.backward的思考
2019/12/27 Python
python重要函数eval多种用法解析
2020/01/14 Python
利用python实现汉诺塔游戏
2021/03/01 Python
DeinDesign德国:设计自己的手机壳
2019/12/14 全球购物
英国排名第一的宠物店:PetPlanet
2020/02/02 全球购物
元旦晚会邀请函
2014/01/27 职场文书
医师定期考核实施方案
2014/05/07 职场文书
捐资助学感谢信
2015/01/21 职场文书
2015年度优秀员工自荐书
2015/03/06 职场文书
超市采购员岗位职责
2015/04/07 职场文书
干部考核工作总结2015
2015/07/24 职场文书
mysql 带多个条件的查询方式
2021/06/05 MySQL