从基类调用重写的方法?

时间:2011-07-08 06:43:16

标签: python

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())的拼写错误

2 个答案:

答案 0 :(得分:5)

是的,你错过了这个:

b.bar()   # echoes B.foo

B没有自己的bar方法,只是从A继承的方法。 A的{​​{1}}来电bar,但在self.foo的实例中最终会调用B的{​​{1}},而不是{{1} } B

让我们再看看你的报价:

  

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

翻译:

  

fooA的方法,基类)   调用foo,但实际上可能会结束   调用派生类的方法   覆盖它(bar那个   覆盖A

答案 1 :(得分:0)

请注意,这不适用于Python 3.6中的私有方法:

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 A.foo, not B.foo

我花了一个小时来找出原因