在读python数据机构与算法
, 发现了下面这个例子, 之前没有碰到过, 记录下来
In [17]: class A:
def f(self):
self.g()
def g(self):
print 'hello world'
....:
In [18]:
In [18]: class B(A):
def g(self):
print 'b is run'
....:
In [19]:
In [19]: b = B()
In [20]: b.f()
b is run
In [21]:
b.f()
的执行过程是:
- 由于b是B的实例对象, 所以首先在B类中查找f
- 没有的话去父类A找, 找到后执行f函数
- 接着在self.f函数中遇到
self.g()
- 由于self的值是一个类C的实例对象, 所以确定g的工作再从调用对象所属属性C类开始进行
- 由于C类里面有函数g的定义, 所以应该调用C类里面的self.g(),输出
b is run
这种通过动态约束确定调用关系的函数称为虚函数