0

我有:

class A:

    def __init__(self):
        pass

    def func_X(self):
        print("Class A: X")

        self.func_Y()

    def func_Y(self):
        print("Class A: Y")
        print("Why does not work?")


class B(A):

    def __init__(self):
        A.__init__(self)

    def func_Y(self):
        print("Class B: Y")


if __name__ == "__main__":

    TEST = B()
    TEST.func_X()

OUTPUT:

Class A: X
Class B: Y

问题:为什么“B.func_Y”有效,但“A.func_Y”无效?这是bug?如何解决?我需要它像在 C++ 中一样工作。C++ 模拟:

#include <iostream>

using namespace std;

class A
{
public:
      void func_X() {cout<<"Class A: X"<<endl; func_Y();}
      void func_Y() {cout<<"Class A: Y"<<endl;}
};

class B: public A
{
public:
      void func_Y() {cout<<"Class B: Y"<<endl;}
};


int main(void)
{
    B TEST = B();
    TEST.func_X();

    return 0;
}

OUTPUT:

Class A: X
Class A: Y

我面对这个问题很长时间,但没有找到解决方案。知道如何解决这个问题吗?

4

2 回答 2

4

发生这种情况是因为您调用func_Y()self. 这可能相当于在 C++ 中调用func_Y()on this

看看这个相关的问题

看来您应该执行 aA.func_Y()或调用 tosuper而不是self.func_Y().

让我知道这是否对您有帮助。

于 2013-05-02T07:11:40.750 回答
1

Python在运行时使用动态类型解析所有内容。C++ 使用静态类型在编译时解决几乎所有问题。如果你想要动态类型解析,你必须在静态类型中告诉编译器。在这种情况下, func_Y virtual在基类中声明,它应该像在 Python 中一样工作。

名称查找的工作方式在 Python 和 C++ 中实际上有很大不同,但在简单的情况下,实际结果就像 Python 中的所有成员都在 C++ 中声明为虚拟一样。除了在 C++ 中,只有函数可以声明为虚拟;在 Python 中,动态查找会影响所有成员。

于 2013-05-02T07:46:33.620 回答