Унаследованное поведение класса Python - PullRequest
0 голосов
/ 01 июня 2018

У меня есть вопрос о методе наследуемого класса 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 голосов
/ 01 июня 2018

В дополнение к ответу Чепнера этот код 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 ++, подумайте, что все члены являются открытыми, а все методы виртуальными.

0 голосов
/ 01 июня 2018

Да, это ожидается.c является экземпляром C, но поскольку C.test не определено, c.test разрешается в B.test.Однако соответствующий вызов self.call() вызывает C.call, поскольку тип времени выполнения self равен C, а не B, а C.call определен .Думайте обо всех методах Python как о виртуальных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...