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实现的去除win下文本文件头部BOM的代码
Feb 10 Python
python格式化字符串实例总结
Sep 28 Python
Python基于pygame实现图片代替鼠标移动效果
Nov 11 Python
Python数据结构与算法之二叉树结构定义与遍历方法详解
Dec 12 Python
python递归实现快速排序
Aug 18 Python
对Django项目中的ORM映射与模糊查询的使用详解
Jul 18 Python
python 解决selenium 中的 .clear()方法失效问题
Sep 01 Python
Scrapy爬虫文件批量运行的实现
Sep 30 Python
基于python实现百度语音识别和图灵对话
Nov 02 Python
用Python创建简易网站图文教程
Jun 11 Python
教你用python实现12306余票查询
Jun 30 Python
JAVA SpringMVC实现自定义拦截器
Mar 16 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
php explode函数实例代码
2012/02/27 PHP
PHP 第二节 数据类型之字符串类型
2012/04/28 PHP
php中的常用魔术方法总结
2013/08/02 PHP
PHP中常用的数组操作方法笔记整理
2016/05/16 PHP
PHP获取指定日期是星期几的实现方法
2016/11/30 PHP
PHP实现简单的协程任务调度demo示例
2020/02/01 PHP
JavaScript 判断判断某个对象是Object还是一个Array
2010/01/28 Javascript
js下拉菜单语言选项简单实现
2013/09/23 Javascript
登陆成功后自动计算秒数执行跳转
2014/01/23 Javascript
Jquery获取元素的父容器对象示例代码
2014/02/10 Javascript
js判断设备是否为PC并调整图片大小
2014/02/12 Javascript
微信WeixinJSBridge API使用实例
2015/05/25 Javascript
jQuery实现按钮的点击 全选/反选 单选框/复选框 文本框 表单验证
2015/06/25 Javascript
Bootstrap table 定制提示语的加载过程
2017/02/20 Javascript
vue快捷键与基础指令详解
2017/06/01 Javascript
微信小程序中this.data与this.setData的区别详解
2018/09/17 Javascript
浅谈vue加载优化策略
2019/03/19 Javascript
JS 遍历 json 和 JQuery 遍历json操作完整示例
2019/11/11 jQuery
js实现九宫格抽奖
2020/03/19 Javascript
JS实现横向跑马灯效果代码
2020/04/20 Javascript
VueQuillEditor富文本上传图片(非base64)
2020/06/03 Javascript
[02:36]DOTA2英雄基础教程 斯拉克
2013/11/29 DOTA
python+splinter实现12306网站刷票并自动购票流程
2018/09/25 Python
Python中的字符串切片(截取字符串)的详解
2019/05/15 Python
Python安装selenium包详细过程
2019/07/23 Python
基于TensorBoard中graph模块图结构分析
2020/02/15 Python
Python3 assert断言实现原理解析
2020/03/02 Python
IBatis持久层技术
2016/07/18 面试题
挑战杯创业计划书的写作指南
2014/01/07 职场文书
大学同学聚会邀请函
2014/01/19 职场文书
优秀党员获奖感言
2014/02/18 职场文书
新年抽奖获奖感言
2014/03/02 职场文书
起诉离婚协议书样本
2014/11/25 职场文书
指导教师推荐意见
2015/06/05 职场文书
python套接字socket通信
2022/04/01 Python
create-react-app开发常用配置教程
2022/06/25 Javascript