潜入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
Run Code Online (Sandbox Code Playgroud)
......但这两者似乎都很明显.
我错过了引用中暗示的内容吗?
编辑了在原始代码中调用a.foo()(而不是a.bar())和b.foo()(而不是b.bar())的错字
是的,你错过了这个:
b.bar() # echoes B.foo
Run Code Online (Sandbox Code Playgroud)
B没有bar自己的方法,只有从中继承的方法A.A的bar通话self.foo,但在一个实例B结束调用B的foo,而不是A的foo.
让我们再看看你的报价:
调用同一基类中定义的另一个方法的基类方法实际上最终可能会调用覆盖它的派生类的方法
要翻译:
bar(A基类的方法)调用self.foo,但实际上最终可能会调用覆盖它的派生类的方法(B.foo覆盖A.foo)
小智 5
请注意,这不适用于 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
Run Code Online (Sandbox Code Playgroud)
我花了一个小时找出原因
| 归档时间: |
|
| 查看次数: |
5056 次 |
| 最近记录: |