重新定义 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,第一个版本会引发错误,而第二个版本会按预期工作。