猴子补丁
猴子补丁的核心:就是用自己的代码替换所用模块的源代码,详细地址如下:
1.这个词原来为Guerrilla Patch ,杂牌军,游击队,说明这部分不是原装的,在英文里guerilla发音和gorllia(猩猩)相似,再后来就写了monkey(猴子)
2.还有一种解释说由于这种方式将原来的代码弄乱了(messing with it),在英文里叫monkeying about(顽皮的),所以叫做Monkey Match
1.拥有在模块运行时替换的功能,列如:一个函数对象赋值给另外一个函数对象,(把函数原本的执行的功能给替换了)
class Monkey:
def hello(self):
print('hello')
def world(self):
print('world')
def other_func():
print("from other_func")
monkey = Monkey()
monkey.hello = monkey.world
monkey.hello()
monkey.world = other_func
monkey.world()
猴子补丁的运行场景
如果我们的程序中已经基于json模块写了大量代码了,发现有一个模块ujson比它性能更高,但用法不一样,我们肯定不会想所有的代码都替换成ujson.dumps或者ujson.loads,那么我们可能会这样做
import ujson as json ,但是这么做,需要每个文件都重新导入一下,维护成本依然很高,此时我们就可以用到猴子补丁
import json
import ujson
def monkey_patch_json():
json.__name__ = 'ujson'
json.dumps = ujson.dumps
json.loads = ujson.loads
monkey_patch_json()
Patch.采用猴子补丁之后,如果发现ujson不符合预期,那也可以快速撤掉补丁。个人感觉Monkey
Patch带了便利的同时也有搞乱源代码的风险!