从基类调用派生类中的重写方法

8 投票
7 回答
16191 浏览
提问于 2025-04-16 00:10

我在阅读关于的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()能被调用。

撰写回答