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 相关文章推荐
记录Django开发心得
Jul 16 Python
Python实现简单拆分PDF文件的方法
Jul 30 Python
python fabric实现远程部署
Jan 05 Python
Python 12306抢火车票脚本 Python京东抢手机脚本
Feb 06 Python
python使用xslt提取网页数据的方法
Feb 23 Python
分享Pycharm中一些不为人知的技巧
Apr 03 Python
python如何求解两数的最大公约数
Sep 27 Python
​如何愉快地迁移到 Python 3
Apr 28 Python
python反转列表的三种方式解析
Nov 08 Python
Python autoescape标签用法解析
Jan 17 Python
Python3爬虫关于识别检验滑动验证码的实例
Jul 30 Python
pycharm使用技巧之自动调整代码格式总结
Nov 04 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
编写漂亮的代码 - 将后台程序与前端程序分开
2008/04/23 PHP
PHP获取数组中单列值的方法
2017/06/10 PHP
一个选择最快的服务器转向代码
2009/04/27 Javascript
flash调用js中的方法,让js传递变量给flash的办法及思路
2013/08/07 Javascript
Jquery Ajax解析XML数据(同步及异步调用)简单实例
2014/02/12 Javascript
实例分析js和C#中使用正则表达式匹配a标签
2014/11/26 Javascript
jQuery提示插件alertify使用指南
2015/04/21 Javascript
jquery获取url参数及url加参数的方法
2015/10/26 Javascript
你一定会收藏的Nodejs代码片段
2016/02/04 NodeJs
基于React.js实现原生js拖拽效果引发的思考
2016/03/30 Javascript
使用PHP+JavaScript将HTML页面转换为图片的实例分享
2016/04/18 Javascript
JS脚本实现动态给标签控件添加事件的方法
2016/06/02 Javascript
JavaScript面向对象编写购物车功能
2016/08/19 Javascript
深入浅出 jQuery中的事件机制
2016/08/23 Javascript
jQuery EasyUI 页面加载等待及页面等待层
2017/02/06 Javascript
layui表格实现代码
2017/05/20 Javascript
详解JavaScript 为什么要有 Symbol 类型?
2019/04/03 Javascript
layui点击弹框页面 表单请求的方法
2019/09/21 Javascript
详解node.js 事件循环
2020/07/22 Javascript
深入解析Python中的变量和赋值运算符
2015/10/12 Python
Python selenium 三种等待方式详解(必会)
2016/09/15 Python
python rsa 加密解密
2017/03/20 Python
详解Numpy数组转置的三种方法T、transpose、swapaxes
2019/05/27 Python
详细介绍pandas的DataFrame的append方法使用
2019/07/31 Python
Django框架中序列化和反序列化的例子
2019/08/06 Python
以SQLite和PySqlite为例来学习Python DB API
2020/02/05 Python
利用Python实现斐波那契数列的方法实例
2020/07/26 Python
Django-Scrapy生成后端json接口的方法示例
2020/10/06 Python
潘多拉珠宝美国官方网站:Pandora US
2020/06/18 全球购物
超市实习总结自我鉴定
2013/09/19 职场文书
马云的职业生涯规划之路
2014/01/01 职场文书
决定成败的关键——创业计划书
2014/01/24 职场文书
单位委托书范本(3篇)
2014/09/18 职场文书
师德师风个人总结
2015/02/06 职场文书
仓管员岗位职责范本
2015/04/01 职场文书
React Fragment介绍与使用详解
2021/11/11 Javascript