程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python的猴子補丁

編輯:Python

函數是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

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved