1

我在使用Python中的多重繼承時遇到了一些問題,無法理解我在做什麼錯誤。Python 2.7方法解析順序覆蓋

我有三個類A,B,C定義如下它不起作用。

class A(object): 
    def __init__(**kwargs): 
    . 
    . 

class B(object): 
    def __init__(**kwargs): 
    # prepare a dictionary "options" with the options used to call A 
    super(B,self).__init__(**options) 

    def coolmethod(x): 
     #some cool stuff 

對於A和B我沒有任何問題。

我想創建第三個C類,無論從A和B ,這樣我可以在coolmethod在B中定義的繼承,而是想用在A定義構造函數

試圖定義class C(A,B)呢由於未定義MRO而不起作用。

但是,在定義class C(B,A)不允許我使用A. 初始化而不是B. 初始化

我怎樣才能解決這個問題?

回答

2

你可以調用.__的init __()直接而不是使用C中的super()方法:

class C(B,A): 
    def __init__(self, **kwargs): 
     A.__init__(self, **kwargs) 
+0

謝謝..這很容易..我不明白爲什麼在類聲明中的順序很重要,雖然.... – lucacerone 2013-04-29 22:16:53

+1

請參閱我的答案下面的訂單的解釋。 – 2013-05-21 07:01:02

2

您可以使用

class A(object): 
    def __init__(self, **kwargs): 
     super(A, self).__init__(**kwargs) 

,如果你期望從一個多重繼承和別的東西。這樣,總是會調用A.__init__

順序是很重要的,因爲方法解析在python中的工作方式。如果你從(A,B)繼承了C,這意味着如果你調用A上和B上存在的C上的方法,那麼A上的方法被選中(它有優先權)。如果您在類別A中編寫super(A, self).method,這意味着您要擴展由method提供的功能。因此,如果A和B都具有這樣的擴展並且C從這兩個擴展繼承,那麼跳過一個這樣的擴展會是奇怪的。這就是爲什麼當你撥打C.method時,它會執行A.method,當它調用super(A, self).method時,將會調用B.method。換句話說,就好像A爲了方法擴展的目的而從B繼承。當C從(B,A)繼承時,這是不同的。

請注意,__init__的第一個參數應始終爲self,就像每個方法一樣。