假设我有一个类FooClass,它定义了一个方法foo_method.这个类在第三方库中,我想明确地覆盖它.我有许多继承自FooClass的类,所以我不想为每个子类重写foo_method.相反,我想在不深入研究第三方库代码的情况下覆盖类的方法定义.当我尝试显而易见的方式,
from thirdparty import FooClass
class FooClass(object):
def foo_method():
newstuff
Run Code Online (Sandbox Code Playgroud)
我得到了奇怪的行为 - NotImplementedErrors等.我错过了什么吗?
你正在本地重新定义课程; 这不会改变原来的类或影响在别处使用它的任何人.
你可以在类上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()方法.