-1

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

父类方法会调用子类方法。我想知道这是否是预期和稳定的行为?因为我也在 C++ 中尝试了相同的逻辑,所以它会打印

Call from B
4

2 回答 2

3

是的,这是意料之中的。c是 的实例C,但由于C.test未定义,因此c.test解析为B.test。但是,相应的调用self.call()调用,C.call因为运行时类型selfis C、 notBC.call 定义。将所有 Python 方法视为虚拟方法。

于 2018-05-31T21:41:18.073 回答
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++,则认为所有成员都是公共的,并且所有方法都是虚拟的。

于 2018-05-31T21:59:57.467 回答