2015-06-24 45 views

回答

5

它要求無論哪個首先出現在方法解析順序(MRO),這取決於這些子類繼承被定義的順序:

>>> class A(object): 
    def method(self): 
     print('A.method') 


>>> class B(object): 
    def method(self): 
     print('B.method') 


>>> class C(A, B): 
      #^A appears first in definition 
    pass 

>>> C.mro() 
[<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <type 'object'>] 
        #^and therefore is first in the MRO 
>>> C().method() 
A.method # so that's what gets called 

爲了確保的所有實現方法被調用,您可以使用super,這將讓接下來的實施「向上」的MRO:

>>> class A(object): 
    def method(self): 
     print('A.method') 
     super(A, self).method() # this will be resolved to B.method for C 


>>> class B(object): 
    def method(self): 
     print('B.method') 


>>> class C(A, B): 
    pass 

>>> C.mro() # same as before 
[<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <type 'object'>] 
>>> C().method() 
A.method 
B.method 

請注意,在做這件事情時你必須小心謹慎,因爲你有多重繼承,因爲加入superB.method會嘗試呼叫object.method,而不是實現。

+1

謝謝...此外,如果你可以告訴大家,在情況下,它調用A,然後我要訪問的方法B中,我將如何調用myMethod的B中呢? ?? –

+0

您能明確重新定義MRO嗎? –

+2

在python3中,你可以使用'super()。method()',在舊的python中並不是那麼簡單。 – skyking

0

它會調用A.我相信它使用層次結構中的第一個,但是我不完全熟悉Python的模型。我只是,雖然這個小樣本進行了測試:

class A(): 
    def myMethod(self): 
     print("This is A!") 

class B(): 
    def myMethod(self): 
     print("This is B!") 

class child(A,B): 
    def test(self): 
     self.myMethod() 

test = child() 
test.test()