从基类调用派生类中的重写方法
我在阅读关于类的Python文档时,看到了一段我不太明白的内容:
派生类可以覆盖基类的方法。因为在调用同一个对象的其他方法时,方法之间没有特别的权限,所以基类中的一个方法如果调用了同样基类中定义的另一个方法,可能最终会调用一个被派生类覆盖的方法。(对于C++程序员来说:Python中的所有方法实际上都是虚拟的。)
举个例子:
class A:
def foo(self):
self.bar()
def bar(self):
print "from A"
class B(A):
def foo(self):
self.bar()
def bar(self):
print "from B"
这是否意味着类A的一个对象 obj = A()
可能会打印出“来自B”的内容?我这样理解对吗?如果这不太合理我很抱歉。我对Python是如何处理继承和方法覆盖的有点困惑。谢谢!
7 个回答
2
我的回答并不一定和已经发布的那些答案相矛盾,但它展示了一种方法,可以让基类打印“来自B”的信息,这个方法是通过从子类调用基类的方法来实现的。基类仍然会调用子类的方法,因为它是基于子类的实例在工作。也许这就是段落所提到的情况?
class A:
def foo(self):
self.bar()
def bar(self):
print("from A")
class B(A):
def foo(self):
super().foo()
def bar(self):
print("from B")
A().foo() #prints "from A"
B().foo() #prints "from B" but indirectly through the base class
2
a = A()
a.foo()
b = B()
b.foo()
a.bar = b.bar
a.foo()
输出:
from A
from B
from B
8
不可以。父类(superclass)根本不知道子类(subclass)有什么。意思是,如果你创建了一个子类B,它继承了一个方法foo()
,并且重写了一个方法bar()
,那么当你调用foo()
的时候,它会调用子类B里的bar()
定义,而不是父类A里的bar()
定义。这并不是父类的作者想要的,他希望自己写的bar()
能被调用。