函數是Python裡的“一等公民”,可以像變量一樣傳遞和引用,例如:
def hhh():
print("hhh")
def ddd():
print("ddd")
hhh=ddd
hhh()
輸出:
ddd
hhh函數被ddd函數替換了。
而猴子補丁是一種替換類中函數的方法,可以動態地修改類中函數:
class Test:
def func(self):
print("hi")
def monkey(self):
print("hi monkey")
Test.func=monkey
a=Test()
a.func()
輸出:
hi monkey
我們定義了猴子補丁monkey(也可以取別的名字)函數,接收一個參數,注意因為要替換的是類的實例方法,所以第一個參數是實例對象自身,一般取self,取別的名字也可以。monkey函數的參數個數也不一定需要和待替換的func函數一致,可以更多,但是要注意替換後調用時就要按monkey函數的參數數量傳參數了。
class Test:
def func(self):
print("hi")
def monkey(self,a):#參數個數不一定要和func一致
print(self)#打印出<__main__.Test object at 0x7fb5cef7d5b0>,可以看到是類實例對象自身
print("hi monkey")
a=Test()
Test.func=monkey#替換可以發生在實例化之後
a.func(3)#因為monkey函數的參數個數增加了一個,所以要多傳一個
輸出:
<__main__.Test object at 0x7fb5cef7d5b0>
hi monkey
還可以替換實例中的func函數:
class Test:
def func(self):
print("hi")
def monkey(self,a):
print(self)
print("hi monkey")
a=Test()
a.func=monkey#替換類實例中的func函數
a.func(a,3)#但是這時就需要顯式地把實例自身作為第一個參數傳入
輸出:
<__main__.Test object at 0x7f87ec2935b0>
hi monkey