假设我有两个文件,file1.py 和 file2.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()
所以现在我可以打电话给func1()
并从Class2
func2()
.
file2.py:
import file1
class Class3(file1.Class2):
def __init__(self):
pass
问:如何在 file2.py 中更改Class1
func1()
,以便Class2
中的func2()
返回与func1()
相同的内容?
所以不是这样的:
class Class3(file1.Class2):
...
def func1(self):
return "Another string"
我想你想猴子补丁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
但这可能会破坏其他使用 Class1
或 Class2
的代码。
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
中的self
是 Class2
的实例。 Class2
没有定义func1
,所以Class1.func1
被称为。