猴子補丁是我在面試的時候接觸的一到題,學python的時候,我根本就沒有聽說這個概念!那接下來我們來分析一下:
1.什么是猴子補丁?
2.猴子補丁的功能?
3.猴子補丁的應用場景?
一.什么是猴子補丁?
1,這個詞原來為Guerrilla Patch,雜牌軍、游擊隊,說明這部分不是原裝的,在英文里guerilla發音和gorllia(猩猩)相似,再后來就寫了monkey(猴子)。
2,還有一種解釋是說由於這種方式將原來的代碼弄亂了(messing with it),在英文里叫monkeying about(頑皮的),所以叫做Monkey Patch。
名字聽起來稀奇古怪的, 跟python的這個功能搭不上邊, 所以我們直接來說功能吧!
二. 猴子補丁的功能(一切皆對象)
1.擁有在模塊運行時替換的功能, 例如: 一個函數對象賦值給另外一個函數對象(把函數原本的執行的功能給替換了)

1 class Monkey: 2 def hello(self): 3 print('hello') 4 5 def world(self): 6 print('world') 7 8 9 def other_fun(a=1): 10 print(a) 11 12 13 14 monkey = Monkey() 15 monkey.hello = monkey.world 16 monkey.hello() 17 monkey.world = other_fun 18 monkey.world()
三.monkey patch的應用場景
這里有一個比較實用的例子,很多到嗎用到import json, 后來發現ujson性能更高,如果覺得把每個文件的import json改成import ujson as json成本較高, 或者說想測試一下ujson替換是否符合預期, 只需要在入口加上:
import json import ujson def monkey_patch_json(): json.__name__ = 'ujson' json.dumps = ujson.dumps json.loads = ujson.loads monkey_patch_json()
其實這種場景也比較多,比如我們引用團隊通用庫里的一個模塊,又想豐富模塊的功能,除了繼承之外也可以考慮用Monkey Patch.個人感覺Monkey Patch帶了便利的同時也有搞亂源代碼的風險!