在另一个文件中覆盖 class 的方法
Override method of class in another file
假设我有两个文件,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()
所以现在我可以从 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
中的 self
是 Class2
的实例。 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
但这可能会破坏其他使用 Class1
或 Class2
的代码。
假设我有两个文件,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()
所以现在我可以从 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
中的 self
是 Class2
的实例。 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
但这可能会破坏其他使用 Class1
或 Class2
的代码。