重新定义 Python 对象方法?
Redefine Python object method?
假设我有一个 class Foobar
并且我想重新定义它的一个实例的方法:
class Foobar:
def myMethod(self):
print('this method was not overridden')
foo = Foobar()
def foo.myMethod:
print('this method was overridden')
问题是,这种方法会引发错误。有没有办法重新定义对象方法?
您可以创建一个新方法并分配给它
def new_method():
print("Hello")
foo.myMethod = new_method
你正在尝试做的事情叫做 monkeypatching。
方法是非数据描述符,这意味着您放入实例 __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.__dict__
访问 foo.myMethod()
,您将无法调用描述符协议。换句话说,您将无法将 self
传递给 myMethod
。
要完全替换方法,请手动调用描述符协议,并创建绑定方法对象:
def myMethod(self):
print('this method was overridden')
foo.myMethod = myMethod.__get__(foo)
现在 type(foo.myMethod)
再次显示 method
。这很重要,因为如果你想对 class 进行猴子修补,你可以使用完整版本来完成它,并且开箱即用:
Foo.myMethod = myMethod
如果您尝试调用 foo.myMethod
,第一个版本会引发错误,而第二个版本会按预期工作。
假设我有一个 class Foobar
并且我想重新定义它的一个实例的方法:
class Foobar:
def myMethod(self):
print('this method was not overridden')
foo = Foobar()
def foo.myMethod:
print('this method was overridden')
问题是,这种方法会引发错误。有没有办法重新定义对象方法?
您可以创建一个新方法并分配给它
def new_method():
print("Hello")
foo.myMethod = new_method
你正在尝试做的事情叫做 monkeypatching。
方法是非数据描述符,这意味着您放入实例 __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.__dict__
访问 foo.myMethod()
,您将无法调用描述符协议。换句话说,您将无法将 self
传递给 myMethod
。
要完全替换方法,请手动调用描述符协议,并创建绑定方法对象:
def myMethod(self):
print('this method was overridden')
foo.myMethod = myMethod.__get__(foo)
现在 type(foo.myMethod)
再次显示 method
。这很重要,因为如果你想对 class 进行猴子修补,你可以使用完整版本来完成它,并且开箱即用:
Foo.myMethod = myMethod
如果您尝试调用 foo.myMethod
,第一个版本会引发错误,而第二个版本会按预期工作。