2016-03-03 35 views
3

我嘗試一些非常基本的Python繼承:怎麼做Python變量繼承工作

import os 

class Parent: 
    def __init__(self): 
     self.text = 'parent' 

    def getText(self): 
     print self.text 

class Child1(Parent): 
    def __init__(self): 
     self.x = 'x' 

class Child2(Parent): 
    def __init__(self): 
     self.x = 'x' 

if __name__ == "__main__": 
    parent = Parent() 
    child1 = Child1() 
    child2 = Child2() 

    parent.getText() 
    child1.getText() 
    child2.getText() 

,但我不斷收到

Child1實例沒有屬性 '文本'

變量如何傳遞給孩子? (我在的Java/C#,沒有太多的Python背景)

+0

你需要手動調用父類的構造函數 - 這裏,'self.text'在'Parent'構造函數中初始化,它永遠不會被調用。 – Holt

+0

@請問那是什麼? 'super().__ init __()'? –

+0

@deceze不,他們不是。我把'self.x ='x''停止編譯器抱怨縮進塊預計 –

回答

7

您需要手動調用父類的構造函數 - 在這裏,self.text是初始化Parent構造函數永遠不會被調用:

class Child1(Parent): 
    def __init__ (self): 
     super(Child1, self).__init__() 
     # or Parent.__init__ (self) 
     self.x = 'x' 
+0

爲什麼我會使用'super'和'Parent' init? –

+1

@AbdulAhmad有關於此的多個帖子:http://stackoverflow.com/questions/222877/how-to-use-super-in-python,http://stackoverflow.com/questions/576169/understanding-蟒蛇超與-初始化的方法。我個人大多數時候都用「超級」。 – Holt

+0

還有一個問題,從小孩的父母改變'self.text'的正確方法是什麼?只是'self.text ='新文字'?還是有另一種更適合繼承的方式? (一旦定時器關閉,我將接受答案,還剩2分鐘) –

1

你的初始化函數需要調用父類的init

class Child1(Parent): 
def __init__(self): 
    self.x = 'x' 
    Parent.__init__(self) 
1

在蟒蛇當你重寫它是應該被繼承重寫它的所有功能,__init__也不例外。您應該調用函數super方法來使用基礎初始值設定項,或者在您重寫的構造函數中實現該屬性。

class Parent: 
    def __init__(self): 
     self.text = 'parent' 

    def getText(self): 
     print self.text 

class Child1(Parent): 
    def __init__(self): 
     super(Child1, self).__init__() 
     self.x = 'x' 

child1.getText() 

現在應該工作。