2010-04-28 128 views
8

從某一基類派生的類都定義被稱爲「路徑」的屬性。在鴨打字的感覺,我可以在子類中依賴的定義:將參數傳遞給基類構造函數或使用實例變量?

class Base: 
    pass # no "path" variable here 

def Sub(Base): 
    def __init__(self): 
     self.path = "something/" 

另一種可能是使用基類的構造函數:

class Base: 
    def __init__(self, path): 
     self.path = path 

def Sub(Base): 
    def __init__(self): 
     super().__init__("something/") 

我使用Python 3.1。

你會喜歡,爲什麼?有沒有更好的辦法?

回答

11

在Python 3.0+:
我將與參數基類的構造函數去喜歡你的第二個例子都有。因爲這會迫使從Base派生出的類提供必要的路徑屬性,該屬性記錄了類有這樣的屬性以及派生類需要提供它的事實。沒有它,你將依賴於這個被說(讀)在類的文檔字符串的地方,雖然它的確幫助到什麼特殊的屬性意味着文檔字符串也狀態。

在Python 2.6+中:
我會同時使用以上;相反,我會用:

class Base(object): 
    def __init__(self,path): 
     self.path=path; 

class Sub(Base): 
    def __init__(self): 
     Base.__init__(self,"something/") 

換句話說,我需要在基類的構造函數中這樣的參數,因爲它記錄了一個事實,即所有這些類型都會有/使用/需要特定的參數,該參數需要被提供。不過,我不會用超()作爲super is somewhat fragile and dangerous in Python,我也會使基地一new-style class通過繼承從對象(或從其他一些新的樣式)類。

+5

沒有什麼脆弱關於'超()'。脆弱性在2.x語法中,它在3.x(OP所使用的,如super()調用所示)中是固定的,並且通常是多重繼承。沒有任何理由可以直接在Python 3.x中調用baseclass方法,「super().__ init(...)」語法永遠不會更糟,通常也更好。 – 2010-04-28 10:04:18

+0

通過使用'super'的情況來看,我猜想,守護進程正在使用py3k – SilentGhost 2010-04-28 10:04:25

+0

@Thomas武泰:你會如何使用超級如果你所有的多重繼承和基類具有不同的構造函數簽名?將派生類的所有參數傳遞給所有基類看起來就像是一個骯髒的黑客攻擊,依賴於命名參數,並讓基類理清他們所需要的東西並不是太好。 – kriss 2014-04-14 10:04:24

相關問題