2015-12-16 77 views
1

給定一個父類 'A'Python繼承:有什麼區別?

Class A(object): 
    def __init__(self,a,b): 
     self.a = a 
     self.b = b 

是什麼使一個子類 'B' 的下面的選項中

選項1

Class B(A): 
    def __init__(self,a,b,c): 
     self.a = a 
     self.b = b 
     self.c = c 

選項2

Class B(A): 
    def __init__(self,a,b,c): 
     A.__init__(self, a, b) 
     self.c = c 
之間的差

回答

4

在這種情況下,沒有。但是如果A.__init__做了複雜的邏輯負載呢?你不希望有複製所有在B.

的增強在方案2是使用super()功能:

class B(A): 
    def __init_(self,a,b,c): 
     super(B, self).__init__(a, b) 
     self.c = c 
+0

不應該是'super(B,self)'而不是'super(A,self)'嗎? – hetepeperfan

+0

是的,抱歉;更新。 –

1

你的第一選擇初始化A類(ab)的成員就好像它在類B中一樣。

在初始化B的成員之前,第二個選項使用構造函數A來初始化A的成員。

一種更好的方法來設計Python類是

class A(object): 
    def __init__(self, a, b): 
     self._a = a 
     self._b = b 

    @property 
    def a(self): 
     return self._a 

    @property 
    def b(self): 
     return self._b 

class B(A): 
    def __init__(self, a, b, c): 
     super(B, self).__init__(a, b) 
     self._c = c 

    @property 
    def c(self): 
     return self._c 

_在成員名稱提到的成員不應該直接訪問。裝飾者@property爲會員提供直接訪問者。

請注意,成員是隻讀的。這個類沒有指定setters。例如,c的setter可以聲明如下:

@c.setter 
def c(self, c): 
    self._c = c