从基类调用重写的方法?

Dive into Python -

Python的原作者Guido解释了以这种方式覆盖的方法:“派生类可能会覆盖其基类的方法 . 因为方法在调用同一对象的其他方法时没有特殊权限,所以基类的方法调用另一个方法在同一个基类中定义的方法实际上最终可能会调用覆盖它的派生类的方法 . (对于C程序员:Python中的所有方法都是虚拟的 . )“如果这对你没有意义(它混淆了我的地狱),随意忽略它 . 我以为我会把它传递给我 .

我试图找出一个例子:一个基类的方法调用在同一个基类中定义的另一个方法,实际上可能最终调用一个派生类的方法来覆盖它

class A:      
  def foo(self): print 'A.foo'      
  def bar(self): self.foo()                  

class B(A):      
  def foo(self): print 'B.foo'     

if __name__ == '__main__': 
  a = A()                
  a.bar()                   # echoes A.foo
  b = B()
  b.bar()                   # echoes B.foo

......但这两者似乎都很明显 .

我错过了引用中暗示的内容吗?


更新

编辑在原始代码中调用 a.foo() (而不是 a.bar() )和 b.foo() (而不是 b.bar() )的拼写错误

回答(1)

2 years ago

是的,你错过了这个:

b.bar()   # echoes B.foo

B 没有自己的 bar 方法,只是从 A 继承的方法 . Abar 调用 self.foo ,但在 B 的实例中最终调用 Bfoo ,而不是 Afoo .

让我们再看看你的报价:

调用同一基类中定义的另一个方法的基类方法实际上最终可能会调用覆盖它的派生类的方法

要翻译:

bar(A的方法,基类)调用self.foo,但实际上最终可能会调用覆盖它的派生类的方法(覆盖A.foo的B.foo)