如何覆盖Python中的方法?

Cri*_*an 0 python overwrite python-3.x

我遇到了一个两难的困境,fileB我需要在课堂上调用classC,但在此之前我需要覆盖functionA. 我不知道该怎么做。感谢您提前提供的任何帮助!

#fileA

class classA():
    def functionA():
        print('Hello World!')


class classB(classA):
    pass

class classC(classB):
    pass


#fileB

from fileA import classC
#overwrite functionA
classC()
Run Code Online (Sandbox Code Playgroud)

mha*_*wke 5

做你想做的事情的“正确”方法是重写该方法,而不是覆盖它。您可以通过创建该类的子类并为其一个或多个方法提供新定义来实现这一点。

首先,尽管classA.functionA()- 的定义存在错误,但您需要包含self参数:

class classA:
    def functionA(self):
        print('Hello World!')
Run Code Online (Sandbox Code Playgroud)

纠正后,您需要classCfileB.py其中定义一个新的子类来覆盖functionA()

from fileA import classC

class classD(classC):
    def functionA(self):
        print('classD.functionA(): Hello World!')

>>> c = classC()
>>> c.functionA()
Hello World!

>>> d = classD()
>>> d.functionA()
classD.functionA(): Hello World!
Run Code Online (Sandbox Code Playgroud)

值得指出的是,类classBclassC看起来毫无意义,因为(如图所示)它们没有对基类进行任何更改A。所以你可以直接子类化classA

这是最基本的面向对象设计/编程,所以我建议您看一两个教程。

正如我上面所说,这是正确的方法。您还可以像这样替换/覆盖该方法:

from fileA import classC

def my_function_A(self):
    print('my_function_A(): Hello World!')

>>> c = classC()
>>> c.functionA()
Hello World!

>>> classC.functionA = my_function_A    # overwrite the method
>>> classC().functionA()
my_function_A(): Hello World!
>>> c.functionA()
my_function_A(): Hello World!
Run Code Online (Sandbox Code Playgroud)

但覆盖比覆盖它更好。一个问题是,如果您覆盖该方法,任何先前存在的实例classC也会受到影响,如上面代码的最后一行所示。