2013-05-02 77 views
0

我:Python 3中繼承相同的C++

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」?這是錯誤?如何解決它?我需要這個和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 

我面對這個問題很長一段時間,但還沒有找到一個解決方案。任何想法如何解決這個問題?

+3

似乎在Python函數中是'虛擬'的。如果你需要它的行爲不同,你需要以不同的方式進行設計。 C++和Python不是相同的語言,並且行爲會彼此不同。處理它。 – 2013-05-02 07:03:34

+0

你在問什麼? 'A.func_Y'以何種方式「不起作用」?你甚至不會在你的代碼中調用'A.func_Y'。 – BrenBarn 2013-05-02 07:03:57

+0

@BrenBarn:在'A.func_X'中調用 – Blender 2013-05-02 07:06:29

回答

4

發生這種情況是因爲您在self上致電func_Y()。這可能與在this上調用func_Y()的C++等效。請看related question

看來你應該做一個A.func_Y()或致電super而不是self.func_Y()

讓我知道這是否對您有所幫助。

+1

這應該是'A.func_Y(self)'。 – 2013-05-02 07:23:04

+0

@Jim這有效。謝謝! – Shaman 2013-05-02 07:37:11

+1

我不明白這個答案。在Python中,當從成員內部調用時,你必須使用'self.function()';在C++中,這將是'this-> function();',除了'this->'是隱含的。 – 2013-05-02 07:48:54

1

Python在運行時使用動態 類型解析了的所有內容。 C++在編譯時解析了幾乎所有的東西,使用了靜態類型 。如果你想要動態類型解析,你必須告訴 編譯器這個在靜態類型。在這種情況下,在基類中聲明 func_Yvirtual,它應該像Python中的 一樣工作。

名稱查找工作方式實際上是在Python和C++顯著不同 ,但在簡單的情況下,實際效果 都彷彿在Python中的所有成員都宣稱使用C++虛。 除了在C++中,只有函數可以聲明爲虛函數;在 Python中,動態查找影響全部成員。