我有一个关于python继承类方法的问题,在下面的代码中。
class B(object):
def test(self):
self.call()
def call(self):
print("Call from B")
if __name__ == "__main__":
b = B()
b.test()
from b import B
class C(B):
def call(self):
print("Call from C")
if __name__ == "__main__":
c = C()
c.test()
当我运行此代码时,结果是
Call from C
父类方法将调用children的方法。我想知道这是否是一种预期和稳定的行为?因为我也在C ++中尝试相同的逻辑,它将打印
Call from B
答案 0 :(得分:3)
是的,这是预料之中的。 c
是C
的一个实例,但由于C.test
未定义,c.test
会解析为B.test
。但是,对self.call()
的相应调用会调用C.call
,因为self
的运行时类型为C
,而不是B
,{ {1}} 已定义。将所有Python方法都视为虚拟方法。
答案 1 :(得分:2)
作为chepner答案的补充,这个C ++代码表现出与Python中完全相同的行为:
#include <iostream>
class B {
public:
void test() {
call();
}
virtual void call() {
std::cout << "Called from B" << std::endl;
}
};
class C: public B {
public:
void call() {
std::cout << "Called from C" << std::endl;
}
};
int main() {
C c;
c.test(); // will print Called from C
return 0;
}
如果你来自C ++认为所有成员都是公开的,所有方法都是虚拟的。