先自定義兩個模塊,然后,我們調用模塊時,用打補丁方式,改寫mod_1.py模塊。為mod_2.py內容;其實這就相當於,在不改動mod_1.py模塊的前提下,打上補丁。
寫這個主要是gevent協程的時候,用到的monkey.patch_all()補丁,其實原理就是這樣。
mod_1.py
mod_2.py
第一種方法:
調用時實現補丁。
def monkey_patch_module_2(): import sys import mod_1 #mod_1.mod1_function() #print mod1_function sys.modules['mod_1'] = __import__("mod_2") import mod_1 mod_1.mod2_function() #print mod2_function monkey_patch_module_2()
結果輸出:
mod2_function
小結:從結果可以看出,我們已經把mod_1.py模塊,以補丁的形勢,替換到了mod_1.py中。
其實嚴格的說,不能算是打補丁,因為這里完全的把mod_1.py模塊的內容替換成了mod_2.py。
這也是在不改變系統原來的代碼或內置函數的情況下,來替成我們的代碼。注意,這是替換運行時的模塊內容。
第二種方法:
import mod_1 import mod_2 def mokey_patch_m_2(): mod_1.__name__ = "mod_2" #此可有可無,但是防止亂,還是加上好。 mod_1.mod1_function = mod_2.mod2_function mokey_patch_m_2() mod_1.mod1_function()
結果:
mod2_function
小結:從結果可以看出,mod_1模塊的mod1_function()輸出的是mod2_function的內容。
其實不難理解,我們就是在運行時,將mod_1.mod1_funcion對象,替換成mod2_function對象。
總結:至於這么做有什么用處,主要是在不改變原來的方法,但是又可以通過打補丁的方式,自定義一些功能。 到真正用的時候就你明白有什么用了。