猴子補丁(Monkey Patching)


猴子補丁是我在面試的時候接觸的一到題,學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()
View Code

 

三.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帶了便利的同時也有搞亂源代碼的風險!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM