2012-05-12 40 views
0

假設一個類繼承2個類:一個接受1個參數,另一個接受無。 如何確保參數獨立於子類的順序傳遞給接受參數的類?將參數傳遞給super()的正確繼承類()

具體來說,我有問題,這個例子:

class Generic(object): 
    def __init__(self,data): 
     self.data=data 
    def do_data(self): 
     print(self.data) 
class Generic2(object): 
    def __init__(self): 
     pass 
    def no_data(self): 
     print("No_data") 
class MyClass(Generic2,Generic): 
    def __init__(self,data): 
     self.data=data 
     super().__init__(data) 
A=MyClass("A") 

返回一個類型錯誤,由於初始化參數。

錯誤是簡單地用修正:

... 
class MyClass(Generic,Generic2): 
    ... 

我認爲super()使用MRO決定初始化的類。

問題是:在Python3中,如何確保將參數發送到與我的子類的順序無關的正確子類?

(溫柔...我有任何東西很酥知識OO!)

回答

3

相關:https://fuhm.net/super-harmful/

只需使用類,你想直接初始化:

class MyClass(Generic2, Generic): 
    def __init__(self, data): 
     Generic.__init__(data) 
     self.data = data 
+0

取而代之的是閱讀[Python's super()認爲超級!](http://rhettinger.wordpress.com/2011/05/26/super-considered-super/),它解決了問題而不是嘲笑它);簡短版本:接受你不控制(大部分)訂單,併爲一個一致的接口和一個共同的基類。 – delnan

1

的延伸了一下,評論說是評論太長:

當你確切地知道你的類層次結構看起來你可以直接調用你想要調用的方法。如果不確定類層次結構的外觀,super()是必需的。例如,製作圖書館時就是這種情況。你不知道人們將如何使用該庫以及他們將使用哪個基類。所以你需要確保所有類的接口都是相同的,並且所有類都調用super()。

但是,只要類的接口不相同,super()就會停止變得有用,部分原因是您不再可以以任意順序調用類。您現在需要按特定順序對它們進行初始化,然後您必須明確指出該順序。

+0

謝謝!這說得通。非常感謝這個明確的解釋。 – mauscope

相關問題