Python猴子補丁

屬性在運行時的動態(tài)替換,叫做猴子補?。∕onkey Patch)。

為什么叫猴子補丁

屬性的運行時替換和猴子也沒什么關(guān)系,關(guān)于猴子補丁的由來網(wǎng)上查到兩種說法:

1,這個詞原來為Guerrilla Patch,雜牌軍、游擊隊,說明這部分不是原裝的,在英文里guerilla發(fā)音和gorllia(猩猩)相似,再后來就寫了monkey(猴子)。
2,還有一種解釋是說由于這種方式將原來的代碼弄亂了(messing with it),在英文里叫monkeying about(頑皮的),所以叫做Monkey Patch。

猴子補丁的叫法有些莫名其妙,只要和“模塊運行時替換的功能”對應(yīng)就行了。

猴子補丁的用法

1,運行時動態(tài)替換模塊的方法

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.
假設(shè)一個類有一個方法get_data。這個方法做一些外部查詢(如查詢數(shù)據(jù)庫或者Web API等),類里面的很多其他方法都調(diào)用了它。然而,在一個單元測試中,你不想依賴外部數(shù)據(jù)源。所以你用啞方法態(tài)替換了這個get_data方法,啞方法只返回一些測試數(shù)據(jù)。

另一個例子引用了,Zope wiki上對Monkey Patch解釋:

from SomeOtherProduct.SomeModule import SomeClass

def speak(self):
    return "ook ook eee eee eee!"

SomeClass.speak = speak

還有一個比較實用的例子,很多代碼用到 import json,后來發(fā)現(xiàn)ujson性能更高,如果覺得把每個文件的import json 改成 import ujson as json成本較高,或者說想測試一下用ujson替換json是否符合預(yù)期,只需要在入口加上:

import json  
import ujson  

def monkey_patch_json():  
    json.__name__ = 'ujson'  
    json.dumps = ujson.dumps  
    json.loads = ujson.loads  

monkey_patch_json()  

2,運行時動態(tài)增加模塊的方法

這種場景也比較多,比如我們引用團隊通用庫里的一個模塊,又想豐富模塊的功能,除了繼承之外也可以考慮用Monkey Patch。
個人感覺Monkey Patch帶了便利的同時也有搞亂源代碼優(yōu)雅的風(fēng)險。

參考:

http://stackoverflow.com/questions/5626193/what-is-a-monkey-patch
http://www.itdecent.cn/p/f1060b22aab8
http://blog.csdn.net/handsomekang/article/details/40297775

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 背景: 閱讀新聞 12C CDB模式下RMAN備份與恢復(fù) [日期:2016-11-29] 來源:Linux社區(qū) 作...
    陽屯okyepd閱讀 3,828評論 0 7
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,533評論 19 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,872評論 25 709
  • 一排路燈 朦朧著惺忪睡意的眸子 拐彎處那盞玉蘭花燈 一側(cè)懸掉著 是這個秋天垂下來的眼袋 夜,打起很響的鼾聲 而我輾...
    指尖蝶舞的花園閱讀 547評論 0 3
  • 朋友們周末愉快!
    坐看云起的Annie閱讀 222評論 0 1

友情鏈接更多精彩內(nèi)容