蟒蛇。在不创建派生类的情况下覆盖方法并调用原始方法

时间:2017-01-13 11:39:42

标签: python

我的功能如下:

ModuleA.py

Class FooClass:
    def fooMethod(self):
        self.doSomething()

现在我想覆盖那个方法,但是没有从该类派生并从内部调用重写方法:

ModuleB.py

from ModuleA import FooClass

def _newFooMethod(self):
    if(not hasAttr(self,"varA "):
        self.varA = 0
    #Do some checks with varA

    #CALL ORIGINAL fooMethod

FooClass.fooMethod = _newFooMethod

要了解的事情:

  • 我无法访问FooClass。

  • 我无法访问FooClass的实例,因为它们很多而且不在一个地方。

  • 如你所见,我真正想要的是装饰fooMethod。
  • 我还想创建一个类似" varA"的变量。在_newFooMethod中使用它。我这样做是首先检查它是否已经创建并创建它,如果没有,但我不知道这是否是最好的方法...

1 个答案:

答案 0 :(得分:3)

您不使用继承。你所做的就是monky patching!

所以你可以做到以下几点:

ModuleB.py

from ModuleA import FooClass

# Preserve the original function:
FooClass.originalFooMethode = FooClass.fooMethode

def _newFooMethod(self):
    if(not hasAttr(self,"varA "):
        self.varA = 0
    #Do some checks with varA

    #CALL ORIGINAL fooMethod
    self.originalFooMethode()

FooClass.fooMethod = _newFooMethod