2017-04-02 146 views
1

所以,這裏的問題..Python類繼承__init__

,如果你這樣做:

class x(object): 
    def __init__(self): 
    pass 

爲什麼你會顯式調用初始化子類來訪問父類的屬性? (無論如何,y類都具有x類屬性。)

class y(x): 
    def __init__(self): 
    x.__init__(self) 

乾杯。

編輯:

我看了這篇文章https://linuxmeerkat.wordpress.com/2015/04/28/why-you-should-use-super-in-python/,它說:「在現實生活中,我們往往會運行每一個父類的初始化這簡直是,因爲程序設計如何往往是在我們的簡單。舉例來說,解決這個問題的一個方法是明確地調用A的初始化方法:「有人可以解釋嗎?

+0

的基類可能會改變。 –

回答

0

的事實是,在蟒蛇有類和實例之間有明顯的區別屬性:在類體內聲明

  • 屬性,任何方法外,有類屬性,它們是相同的該類的每個對象都是由子類繼承的對象。請注意,做instance_obj.class_att = something不會更改類屬性的值,但只是創建實例屬性並隱藏該對象的共享類屬性。

  • 實例屬性是聲明語法instance_obj.att = something的那些,他們沒有實例之間共享和最相似的事情,你在其他編程語言有非靜態的屬性,它們通常在創建init方法。 self只是一個約定,用於指示自動傳遞給方法的實例對象。

下面是一個例子:

class MyClass: 
    c = 1     #class attribute, the subclasses will inherit this 
    def __init__(self): 
     self.i = 1   #instance attribute 

MyClass.c  #access attribute c of class MyClass 
MyClass.i  #error! MyClass has no attribute i 
x = MyClass() #calling __init__ creates instance attribute i for obj x 
x.i   #access instance attribute i of object x 
x.c   #access class attribute c of class MyClass 
x.c = 2  #hide MyClass.c and create instance attribute c for obj x 
x.c   #access instance attribute c of obj x 

所以,總結一下,這樣做的:

class y(x): 
    def __init__(self): 
     x.__init__(self) 

是有用的,因爲如果基類本來這樣的事情

class x: 
    def __init__(self): 
     self.i=1 

你不可能從任何y的實例訪問屬性i只是因爲他們不會擁有它。

+0

謝謝,但如果基類ATTR改變,就像在你的榜樣'self.i = 1',稱X .__初始化__在'類y'(個體經營)將獲得屬性'i'爲'類y',是不是? – Roy

+0

@Roy我是一個實例屬性,但肯定,這就是你這樣做的原因! – andre

+0

Soz,如果'class'中已經定義了'我'是一個實例屬性? – Roy

0

因爲子類繼承父類,當然,這意味着它的永恆性:方法,屬性和構造函數。 因此,不要重寫所有的__init__代碼,而只需使用已經寫在父類中的內容。 希望它對你有意義。

0

而不是顯式調用init函數,而應該使用super()方法。

在蟒蛇3.0+,你可以使用jusy:

class y(x): 
    def __init__(self): 
     super().__init__() 

在蟒蛇2.7或以下,使用:

class y(x): 
    def __init__(self): 
     super(self.__class__, self).__init__() 

超()可以讓你避免提及到基類明確。