假設我有一個類Foobar,我想重新定義它的一個實體的方法:
class Foobar:
def myMethod(self):
print('this method was not overridden')
foo = Foobar()
def foo.myMethod:
print('this method was overridden')
問題是,這種方法會引發錯誤。有沒有辦法重新定義物件方法?
uj5u.com熱心網友回復:
您可以創建一個新方法并分配它
def new_method():
print("Hello")
foo.myMethod = new_method
uj5u.com熱心網友回復:
您正在嘗試做的事情稱為猴子補丁。
方法是非資料描述符,這意味著您放入實體中的任何__dict__具有相同名稱的東西都會覆寫它:
class Foobar:
def myMethod(self):
print('this method was not overridden')
foo = Foobar()
type(foo.myMethod)顯示method。
def myMethod():
print('this method was overridden')
foo.myMethod = myMethod
現在type(foo.myMethod)顯示function。
由于您foo.myMethod()從訪問foo.__dict__,您將無法呼叫描述符協議。換句話說,您將無法傳遞self給myMethod.
要完全替換該方法,請手動呼叫描述符協議,并創建一個系結的方法物件:
def myMethod(self):
print('this method was overridden')
foo.myMethod = myMethod.__get__(foo)
現在再次type(foo.myMethod)顯示method。這很重要,因為如果您想對課程進行猴子補丁,您可以使用完整版本并使其開箱即用:
Foo.myMethod = myMethod
如果您嘗試呼叫,第一個版本會引發錯誤foo.myMethod,而第二個版本會按預期作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/411925.html
標籤:
上一篇:如何從嵌套物件中獲取密鑰?
