在另一个文件中覆盖 class 的方法

Override method of class in another file

假设我有两个文件,file1.pyfile2.py。在file1.py中,我定义了两个类,一个继承了另一个:

file1.py:

class Class1:
    def __init__(self):
        pass

    def func1(self):
        return "Hello world!"

class Class2(Class1):
    def __init__(self):
        pass

    def func2(self):
        return self.func1()

所以现在我可以从 Class2 调用 func1()func2()

file2.py:

import file1

class Class3(file1.Class2):
    def __init__(self):
        pass

问题:如何将func1()Class1更改为file2.py,所以Class2 returns 中的 func2()func1()?

相同

所以不是这样的:

class Class3(file1.Class2):
    ...
    def func1(self):
        return "Another string"

覆盖 func1 行得通吗?

class Class(file1.Class2):
    def func1(self):
        print "Class3.func1"

c = Class3()
c.func2()

由于 func2 未在 Class3 中定义,因此调用 Class2.func2。但是,在该函数的主体中,self 仍然是 Class3 的实例,因此 self.func1() 调用 Class3.func1,而不是 Class1.func1。这不同于

d = Class2()
d.func2()

其中 Class2.func2 中的 selfClass2 的实例。 Class2没有定义func1,所以调用Class1.func1

我想你想要 monkeypatch Class1.func1

c2 = Class2()
print(c2.func2())
Hello world!

def new_func1(self):
    return "Another string"

Class1.func1 = new_func1  # This is monkey patching.

print(c2.func2())
Another string

但这可能会破坏其他使用 Class1Class2 的代码。