Python继承了类行为

时间:2018-05-31 21:35:18

标签: python inheritance

我有一个关于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

2 个答案:

答案 0 :(得分:3)

是的,这是预料之中的。 cC的一个实例,但由于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 ++认为所有成员都是公开的,所有方法都是虚拟的。