覆盖类的方法定义

时间:2013-12-09 20:58:10

标签: python

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

from thirdparty import FooClass

class FooClass(object):

  def foo_method():
    newstuff

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

2 个答案:

答案 0 :(得分: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

现在,任何试图在Python解释器中的.foo_method()个实例上调用FooClass的代码都会找到并调用您的new_foo_method()方法。

答案 1 :(得分:4)

首先想到的是使用简单的继承ala

from thirdparty import FooClass

class MyUpdatedClass(FooClass):

  def foo_method():
    newstuff