如何覆盖 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 classB
和 classC
似乎毫无意义,因为(如图所示)它们没有对基础 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。
我有点进退两难,在 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 classB
和 classC
似乎毫无意义,因为(如图所示)它们没有对基础 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。