2011-05-16 118 views
3

雖然學習Python中我有過的使用繼承類的初始化語法有些混亂。在各種例子我見過類似如下:Python的__init__語法

class Foo(Bar): 
    def __init__(self, arg, parent = None): 
     Bar.__init__(self, parent) 
     self.Baz = arg 
     etc. 

雖然有時它只是

class Foo(Bar): 
    def __init__(self, arg): 
     Bar.__init__(self) 
     etc. 

一個何時需要確保使用「父」作爲參數初始化函數?謝謝。

回答

7

一般通過parent不是唯一的需要的東西,只有當父類的構造函數中明確需要這樣的說法。這用於一些層次結構中,如PyQt。

和父類初始化的一個很好的成語是使用super

class Child(Father): 
    def __init__(self): 
    super(Child, self).__init__() 
+0

但是'超()'只與新樣式類作品在Python 2,或Python 3。它不與老式類在Python 2.工作確保您的基類是一種新型的類(繼承自'object')。 – Keith 2011-05-16 07:22:32

+0

@Keith:正確的,雖然使用老式類不建議這些天,因爲它是一個很老的功能 – 2011-05-16 07:30:48

+0

沒錯,但有些人仍然這樣做和OP似乎是遵循老的例子。所以我想我會指出,以防萬一。 – Keith 2011-05-16 08:44:40

2

在您的例子變量「父」是一種誤導。只要父類可以要求必須提供

class Pet: 
    def __init__(self,name): 
     self.name = name 

class Dog(Pet): 
    def __init__(self,name,age): 
     Pet.__init__(self,name) 
     self.age = age 

在這個例子中,父類寵物需要的屬性(名稱)額外的參數,而子類提供它

正如指出的那樣,用「超級「語法來調用父類的方法