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中使用ConfigParser解析ini配置文件实例
Aug 30 Python
python统计文本字符串里单词出现频率的方法
May 26 Python
Python脚本实现虾米网签到功能
Apr 12 Python
Python实现破解猜数游戏算法示例
Sep 25 Python
应用OpenCV和Python进行SIFT算法的实现详解
Aug 21 Python
django连接oracle时setting 配置方法
Aug 29 Python
python读文件的步骤
Oct 08 Python
python基于plotly实现画饼状图代码实例
Dec 16 Python
TensorFlow实现保存训练模型为pd文件并恢复
Feb 06 Python
python爬虫scrapy图书分类实例讲解
Nov 23 Python
Python爬虫之Selenium警告框(弹窗)处理
Dec 04 Python
总结三种用 Python 作为小程序后端的方式
May 02 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 数据库字段复用的基本原理与示例
2011/07/22 PHP
域名和cookie问题(域名后缀)
2012/10/10 PHP
php过滤html中的其他网站链接的方法(域名白名单功能)
2014/04/24 PHP
通过PHP自带的服务器来查看正则匹配结果的方法
2015/12/24 PHP
jQuery向下滚动即时加载内容实现的瀑布流效果
2016/01/07 PHP
PHP7新功能总结
2019/04/14 PHP
二级域名或跨域共享Cookies的实现方法
2008/08/07 Javascript
获取dom元素那些讨厌的位置封装代码
2010/06/23 Javascript
使用 JScript 创建 .exe 或 .dll 文件的方法
2011/07/13 Javascript
window.print打印指定div指定网页指定区域的方法
2014/08/04 Javascript
Javascript原型链和原型的一个误区
2014/10/22 Javascript
用简洁的jQuery方法toggleClass实现隔行换色
2014/10/22 Javascript
JavaScript实现向setTimeout执行代码传递参数的方法
2015/04/16 Javascript
avalonjs实现仿微博的图片拖动特效
2015/05/06 Javascript
JavaScript通过代码调用Flash显示的方法
2016/02/02 Javascript
在js中做数字字符串补0(js补零)
2017/03/25 Javascript
AngularJS+bootstrap实现动态选择商品功能示例
2017/05/17 Javascript
vuejs使用$emit和$on进行组件之间的传值的示例
2017/10/04 Javascript
Bootstrap Table列宽拖动的方法
2018/08/15 Javascript
微信小程序 wx:for遍历循环使用实例解析
2019/09/09 Javascript
jenkins自动构建发布vue项目的方法步骤
2021/01/04 Vue.js
[08:07]DOTA2每周TOP10 精彩击杀集锦vol.8
2014/06/25 DOTA
CentOS 6.X系统下升级Python2.6到Python2.7 的方法
2016/10/12 Python
对python中return和print的一些理解
2017/08/18 Python
python os用法总结
2018/06/08 Python
Python发送邮件功能示例【使用QQ邮箱】
2018/12/04 Python
使用python模拟命令行终端的示例
2019/08/13 Python
python 实现读取csv数据,分类求和 再写进 csv
2020/05/18 Python
h5实现获取用户地理定位的实例代码
2017/07/17 HTML / CSS
厂长助理岗位职责
2013/12/27 职场文书
乡镇保密工作责任书
2014/07/28 职场文书
2014年售票员工作总结
2014/11/19 职场文书
爱护公物主题班会
2015/08/17 职场文书
《工作是最好的修行》读后感3篇
2019/12/13 职场文书
对Golang中的FORM相关字段理解
2021/05/02 Golang
Centos7 Shell编程之正则表达式、文本处理工具详解
2022/08/05 Servers