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()
)的拼写错误
答案 0 :(得分:5)
是的,你错过了这个:
b.bar() # echoes B.foo
B
没有自己的bar
方法,只是从A
继承的方法。 A
的{{1}}来电bar
,但在self.foo
的实例中最终会调用B
的{{1}},而不是{{1} } B
。
让我们再看看你的报价:
调用的基类的方法 另一种定义的方法 基类,实际上最终可能会调用 派生类的方法 覆盖它
翻译:
foo
(A
的方法,基类) 调用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
我花了一个小时来找出原因