如何覆盖 python 中的方法?

How do I overwrite method in python?

我有点进退两难,在 fileB 中,我需要调用 class 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()

"proper"做你想做的事情的方法是覆盖方法,而不是覆盖它。为此,您可以创建 class 的子 class 并为其一个或多个方法提供新定义。

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

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

更正后,您需要在 fileB.py 中定义 classC 的新子 class 以覆盖 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!

值得指出的是 classes classBclassC 似乎毫无意义,因为(如图所示)它们没有对基础 class A.所以你可以直接subclass classA代替。

这是最基本的面向对象design/programming所以我建议你看一两个教程。

正如我上面所说,这是正确的做法。你也可以replace/overwrite这样的方法:

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!

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

您要查找的技术名称是 monkeypatching。

Python 中的函数是 first-class 对象。因此,您可以简单地将它们分配给 class 或对象。这确实意味着您可以拥有两个对象,它们是相同 class 的实例,即使调用了相同的名称,它们也会调用两个不同的方法。它们甚至不必用相同的名称或什至根本不需要任何名称来定义;我在看着你,Lambda。