淺談我對python中的monkey patch

nibuyaoshiwang發表於2020-09-25

淺談我對python中的動態補丁:monkey patch的理解和應用。

最近也在幫助朋友處理一些問題的時候,對這個功能有有了進一步的瞭解。

monkey patch是從“游擊隊”的英文guerrilla裡轉變過來的,他表面的意思其實和使用者一點都不相關。他是一種處理機制,一種緊急的動態熱修補很好的方法。改動量小,處理比較快速,適合於線上需求快速變化而不動底層的解決方案。

在實際的運用中,經常會有呼叫底層類或者第三方包類時,對其功能不滿足,從而需要改寫的情況。這時候就可以對其進行patch。

Foo.get_sum = get_sum
Foo().get_sum

上面是對原類進行動態替換的一個簡單例子,我們可以改原來類,代價比較大,而且不單單是去改原類增加if else那麼簡單,我們需要對其進行分析抽象化,這才是對底層基類最合適的修改。
可能有人會問為什麼不做子類,繼承重新改方法。這是可行的,但是忽略了使用monkey patch的前提,儘可能的少改動程式碼,做動態的替換。

其實,解決這個問題有很多的方法,如果我來做,首選還是就是對基類重新分析進行改造,可以使用hook對這個case進行掛鉤處理。但是在最快的時間最簡單的處理模式,還是monkey patch合適一些。它對那些臨時提需求,想把各種效果看完而又不下單的客戶來說是性價格最高的解決方法。

儘管monkey patch還能做很多的事情,有些也超出我所掌握的範疇。但對今天所說的這個方面的使用者其實是有一點的排斥的,我們不能因為有了這個"貼膏藥"式的補救措施,就忽略了對模組架構的長遠佈局,“膏藥”越貼越多,邏輯也會越改越混亂,這些對於一個系統來說,它不會有任何的提升。反過來,我們對底層動手的時候就應該提前考慮他的通用性與擴充套件性,哪怕臨時做了補丁,後面穩定了也方便對底層進行更新。這才是一個優秀程式設計師的良知和義務。

相關文章