属性在运行时的动态替换,叫做猴子补丁(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解释:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,
互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
from SomeOtherProduct.SomeModule import SomeClassdef 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猴子补丁相关推荐

  1. python猴子补丁是什么_什么是Python的monkeypatch(猴子补丁)?

    这个问题是有一次面试的时候问到的,当时确实第一次听说这个,单纯只是非常好奇,于是就去了解了一下. 在维基百科上找到了:我理解的就是Python的一种运行时的机制,简单来说就是这样一个效果. >& ...

  2. python 猴子补丁_python面试题精讲——monkey patch(猴子补丁)

    前言本次依然是选自python面试题系列,将一个比较偏的概念,可能很多人没怎么听说过--猴子补丁,其实所讲的内容很简单,它得益于python灵活的语法.一切皆对象的思想,一起来看看看看吧!目录一.什么 ...

  3. python猴子补丁_Python猴子补丁Monkey Patch用法实例解析

    属性在运行时的动态替换,叫做猴子补丁(Monkey Patch). 为什么叫猴子补丁 属性的运行时替换和猴子也没什么关系,关于猴子补丁的由来网上查到两种说法: 1.这个词原来为Guerrilla Pa ...

  4. python画猴子_Python猴子补丁Monkey Patch用法实例解析

    属性在运行时的动态替换,叫做猴子补丁(Monkey Patch). 为什么叫猴子补丁 属性的运行时替换和猴子也没什么关系,关于猴子补丁的由来网上查到两种说法: 1.这个词原来为Guerrilla Pa ...

  5. python设计模式之猴子补丁模式

    1.所有书中都没有把猴子补丁作为一种设计模式来看待.因为设计模式的模式的命名是根据java中提炼出来的,语言方式决定了java绝对不会有也不需要有这种操作,不存在的.那自然设计模式不会包括猴子补丁模式 ...

  6. Python面试题之“猴子补丁”(monkey patching)指的是什么?这种做法好吗?

    "猴子补丁"就是指,在函数或对象已经定义之后,再去改变它们的行为. 举个例子: import datetime datetime.datetime.now = lambda: da ...

  7. 解决python使用猴子补丁时引入ssl错误

    首先是requests对https发起请求时报ssl错误 解决: requests提供了两个参数 1. verify 官方给出的解释为 当参数为False时,请求将接受由提交的任何TLS证书并将忽略主 ...

  8. python的猴子补丁(Monkey Patching)

    0. 参考文档 参考文档如下: https://achowdhary.com/monkey-patching/ https://www.cnblogs.com/xp1315458571/p/16049 ...

  9. 27.Python中的猴子补丁 (Monkey Patching)

    <Python编程的术与道:Python语言进阶>视频课程 <Python编程的术与道:Python语言进阶>视频课程链接:https://edu.csdn.net/cours ...

  10. 说说Python中猴子补丁是什么?

    公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助! 小猿会从最基础的面试题开始, ...

最新文章

  1. 打架斗殴烫头酗酒抽烟的小混混,逆袭保送中国科学院,后来怎么样了?
  2. 皮一皮:谈恋爱一定要谨慎...
  3. SQL Server Reporting Services(简称SSRS)
  4. linux可以http安装么,Linux 5下 http的安装
  5. SpringMVC之安全性(二)登录界面
  6. Android Multimedia框架总结(四)MediaPlayer从Java层到C++层类关系及prepare及之后其他过...
  7. Linux设备驱动——内核定时器
  8. linux下重启tomcat命令
  9. 现代管理学 罗珉 第三版
  10. 查看git HEAD
  11. 二进制、八进制、十进制、十六进制关系及转换
  12. 界面(1):对话框和菜单 打印和按钮等杂项
  13. 怎么将整个英文的pdf文档翻译成中文
  14. C++ scanf()函数
  15. Java通过二维码下载Apk====安卓手机
  16. 第一卷 第一百三十六章 好白菜
  17. Access Points (单调栈)
  18. Clipper2中的术语和基本概念
  19. 双重游标的使用以及动态游标的使用
  20. java.sql.SQLException: Access denied for user 'app '@'xxx.xxx.xxx.xxx' (using password: YES)

热门文章

  1. css垂直居中怎么设?文字上下居中和图片垂直居中
  2. 英文简历模板计算机专业,计算机专业毕业生英文简历模板
  3. IntelliJ IDEA破解版2018.3.1(亲测可用)
  4. Android安装应用后点击打开(Open)带来的问题及解决方式
  5. 计算机软件设计费计算标准,水利工程咨询、勘测设计费收费标准及计算程序
  6. python气象卫星云图解析_【我教你系列】想要实时的地球图像作为桌面?
  7. xshell写JS脚本自动进行操作
  8. dcp-9020cdn复印位置有_兄弟DCP-9020CDN打印机驱动下载
  9. 学习笔记1-【计算机组成原理】-【计算机科学速成课】[40集全/精校] - Crash Course Computer Science
  10. 智能家居,“智能”是前提,“安全”是根本