Python猴子补丁Monkey Patch用法实例解析


Posted in Python onMarch 23, 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的While循环语句的使用方法
Oct 13 Python
Python引用模块和查找模块路径
Mar 17 Python
Python的时间模块datetime详解
Apr 17 Python
python3.6连接MySQL和表的创建与删除实例代码
Dec 28 Python
Python使用ConfigParser模块操作配置文件的方法
Jun 29 Python
Django框架会话技术实例分析【Cookie与Session】
May 24 Python
python实现七段数码管和倒计时效果
Nov 23 Python
Pycharm安装并配置jupyter notebook的实现
May 18 Python
Python datetime模块使用方法小结
Jun 18 Python
Python用K-means聚类算法进行客户分群的实现
Aug 23 Python
完美解决Pycharm中matplotlib画图中文乱码问题
Jan 11 Python
Python代码实现双链表
May 25 Python
Python面向对象程序设计之静态方法、类方法、属性方法原理与用法分析
Mar 23 #Python
Python3 pickle对象串行化代码实例解析
Mar 23 #Python
Python面向对象程序设计之类和对象、实例变量、类变量用法分析
Mar 23 #Python
Python3 shelve对象持久存储原理详解
Mar 23 #Python
python新式类和经典类的区别实例分析
Mar 23 #Python
Python count函数使用方法实例解析
Mar 23 #Python
使用python实现飞机大战游戏
Mar 23 #Python
You might like
Syphon 秘笈
2021/03/03 冲泡冲煮
隐藏X-Space个人空间下方版权方法隐藏X-Space个人空间标题隐藏X-Space个人空间管理版权方法
2007/02/22 PHP
PHP+XML 制作简单的留言本 图文教程
2009/11/02 PHP
Memcached常用命令以及使用说明详解
2013/06/27 PHP
php命名空间学习详解
2014/02/27 PHP
thinkphp实现图片上传功能分享
2014/03/04 PHP
深入讲解PHP Session及如何保持其不过期的方法
2015/08/18 PHP
用php代码限制国内IP访问我们网站
2015/09/26 PHP
基于PHP实现邮箱验证激活过程详解
2020/10/28 PHP
Jquery Ajax学习实例5 向WebService发出请求,返回泛型集合数据的异步调用
2010/03/17 Javascript
分享几个超级震憾的图片特效
2012/01/08 Javascript
jquery表单验证使用插件formValidator
2012/11/10 Javascript
JavaScript获取路径设计源码
2014/05/22 Javascript
jQuery知识点整理
2015/01/30 Javascript
JavaScript搜索字符串并将搜索结果返回到字符串的方法
2015/04/06 Javascript
JScript中的条件注释详解
2015/04/24 Javascript
深入浅析JSON.parse()、JSON.stringify()和eval()的作用详解
2016/04/03 Javascript
对称加密与非对称加密优缺点详解
2017/02/06 Javascript
vue中使用better-scroll实现滑动效果及注意事项
2018/11/15 Javascript
python通过elixir包操作mysql数据库实例代码
2018/01/31 Python
Python3实现的回文数判断及罗马数字转整数算法示例
2019/03/27 Python
Python 3.8正式发布重要新功能一览
2019/10/17 Python
Django框架HttpResponse对象用法实例分析
2019/11/01 Python
python批量处理多DNS多域名的nslookup解析实现
2020/06/28 Python
Python爬虫自动化获取华图和粉笔网站的错题(推荐)
2021/01/08 Python
html5+css3实现一款注册表单实例
2013/04/17 HTML / CSS
Spartoo荷兰:鞋子、包包和服装
2018/07/12 全球购物
美国最大的存储市场:SpareFoot
2018/07/23 全球购物
写给女朋友的检讨书
2014/01/28 职场文书
大学三年计划书范文
2014/04/30 职场文书
税务干部个人整改措施思想汇报
2014/10/10 职场文书
超强台风观后感
2015/06/09 职场文书
2016年小学生寒假总结
2015/10/10 职场文书
Redis 异步机制
2022/05/15 Redis
SQL Server2019安装的详细步骤实战记录(亲测可用)
2022/06/10 SQL Server
SQLyog的下载、安装、破解、配置教程(MySQL可视化工具安装)
2022/09/23 MySQL