覆盖类的方法定义

use*_*661 3 python

假设我有一个类FooClass,它定义了一个方法foo_method.这个类在第三方库中,我想明确地覆盖它.我有许多继承自FooClass的类,所以我不想为每个子类重写foo_method.相反,我想在不深入研究第三方库代码的情况下覆盖类的方法定义.当我尝试显而易见的方式,

from thirdparty import FooClass

class FooClass(object):

  def foo_method():
    newstuff
Run Code Online (Sandbox Code Playgroud)

我得到了奇怪的行为 - NotImplementedErrors等.我错过了什么吗?

Mar*_*ers 5

你正在本地重新定义课程; 这不会改变原来的类或影响在别处使用它的任何人.

可以在类上monkeypatch方法:

from thirdparty import FooClass

orig_foo_method = FooClass.foo_method

def new_foo_method(self):
    # do new stuff
    # perhaps even call orig_foo_method(self)

FooClass.foo_method = new_foo_method
Run Code Online (Sandbox Code Playgroud)

现在,任何尝试调用Python解释器.foo_method()FooClass任何位置实例的代码都会找到并调用您的new_foo_method()方法.