为什么叫猴子补丁?猴子补丁的这个叫法起源于Zope框架,大家在修正Zope的Bug的时候经常在程序后面追加更新部分,这些被称作是“杂牌军补丁(guerillapatch)”,后来guerilla就渐渐的写成了gorllia(猩猩),再后来就写了monkey(猴子),所以猴子补丁的叫法是这么莫名其妙的得来的 。

文章插图
【大神写Python时,也需要猴子请来的“补丁”】
还有种说法是由于这种方式将原来的代码弄乱了(messing with it),在英文里叫monkeying about(顽皮的),所以叫做Monkey Patch(猴子补丁) 。程序中对猴子补丁的解释猴子补丁指在运行时动态改变类或模块,为的是将第三方代码打补丁在不按预期运行的bug或者feature上。
在运行时动态修改模块、类或函数,通常是添加功能或修正缺陷 。猴子补丁在代码运行时内存中发挥作用,不会修改源码,因此只对当前运行的程序实例有效 。
因为猴子补丁破坏了封装,而且容易导致程序与补丁代码的实现细节紧密耦合,所以被视为临时的变通方案,不是集成代码的推荐方式 。

文章插图
代码解释我假装有一个翻译员的模块,它能使用各种语言print出“你好”,
translator.py
class Translator:def __init__(self):passdef chinese(self):print("你好!")def japanese(self):print("空你兄哇!")def english(self):print("Hello!")然后在另外一个文件调用这个模块,demo.py
from translator import Translatort = Translator()t.japanese()t.english()t.chinese()执行结果:空你兄哇!Hello!你好!然后一个广东的程序员用这个模块的时候,希望调用chinese的时候能print“雷猴”而不是“你好” 。再不改变原来模块(库)的情况下,我们可以这样给这个模块(库)打上我们需要的补丁 。demo.py
from translator import Translatort = Translator()t.japanese()t.english()t.chinese()def canton(self):print("雷猴!")Translator.chinese = cantont2 = Translator()t2.chinese()执行结果:空你兄哇!Hello!你好!雷猴!猴子补丁的实际应用场景stackoverflow上有个比较热的猴子补丁使用案例,很多代码用到 import json,后来发现ujson性能更高,如果觉得把每个文件的import json 改成 import ujson as json成本较高,或者说想测试一下用ujson替换json是否符合预期,只需要在入口加上:import jsonimport ujsondef monkey_patch_json():json.__name__ = 'ujson'json.dumps = ujson.dumpsjson.loads = ujson.loadsmonkey_patch_json()猴子补丁的功能很强大,但是也带来了很多的风险,以上对json模块的修改可能会使整个Python/ target=_blank class=infotextkey>Python进程所使用的json模块都会被替换 。可能自己的代码能hold住,但是其它第三方库,有时候问题并不好排查,即使排查出来也是很棘手 。
推荐阅读
- 盘点一个高德地图Python网络爬虫中前端数据和获取数据不一致问题
- 张柏芝|张柏芝时尚性感魅力写真
- 抖音十大神曲有哪些,盘点2019最新抖音10大神曲
- 中国古代十大神剑排行榜 中国古代十大名剑
- 如何手写立体字?
- 宋妍霏|苍山脚下,宋妍霏冷秋拍摄夏日写真,为了时尚真够拼的
- 树木速写技法表现
- 刘诗诗|刘诗诗粉色长裙写真,网友:啥也不说了,一起来欣赏最新世界油画大片《刘诗诗》
- 赵雅芝|赵雅芝肉眼可见的老了,穿半身裙拽气球眼神疲惫,特写下眼角鱼尾纹抢镜
- 有关清明节古诗词有哪些 描写清明节的诗句
