我正在阅读关于classes的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()
的对象可以某种方式最终打印"from B"?我读得对吗?如果对于python如何处理继承和覆盖有点困惑,我很抱歉 . 谢谢!
7 回答
没有 . 超类无法知道关于子类的任何信息 . 这意味着如果你实例化子类B,并且它继承方法
foo()
,并覆盖方法bar()
,那么当你调用foo()
时,它将调用B中的bar()
定义,而不是A中的bar()
定义 . 这不是什么超级作家的意图 - 他希望他对bar()
的呼吁能够达到他自己的定义 .不,如果您有以下对象,则表示您:
你也是
然后这将打印
from B
作为foo()
,它在 base class 中定义,调用bar()
,它也在基类中定义,但是 overridden in the derived class .至少这是我读它的方式 .
输出:
不,任何
A
对象都会调用A.bar
并打印“from A
”调用哪个重写方法取决于对象是什么,而不是从其类派生的其他类 . 将类视为cookie切割器,将对象视为cookie .
不完全是:
输出:
我的答案并不一定与已发布的答案相矛盾,但它确实显示了一种方法,通过从继承的类中调用基类方法来使“从B”打印基类 . 基类仍然调用继承的类方法,因为它是从继承的self中工作的 . 也许这是段落所指的那种情况?