2012-07-18 109 views
5

我有3類A,B和d給出如下Python的多重繼承

class A(object): 
    def test(self): 
     print "called A" 

class B(object): 
    def test(self): 
     print "called B" 

class D(A,B): 
    def test(self): 
     super(A,self).test() 

inst_d=D() 
inst_d.test() 

---------------------------------------- 
Output: 
    called B 

問題:D.test(),我打電話super(A,self).test()。即使方法A.test()也存在,爲什麼只調用B.test()

+1

方式Python的超級作品有些不明顯。如何正確使用它具有很大的實用指南是這個:http://rhettinger.wordpress.com/2011/05/26/super-considered-super/ – millimoose 2012-07-18 18:18:20

回答

6

因爲你告訴它不要。在D.test你告訴它來調用父的的測試方法 - 這就是super一樣。

通常要在super調用使用當前的類名。

+0

此外,其他類也需要調用'超()'來參加MRO的下一堂課。 – kindall 2012-07-18 18:19:04

+0

而「正常」也可能是「幾乎總是」;在方法解析順序中跳到隨機位置的假設用例可能會相當奇特。 – millimoose 2012-07-18 18:20:29

+2

答案是有點不清楚 - 'B'不A'的'父,那麼爲什麼'B.test()被調用'不是很明顯。 – 2012-07-18 18:20:51

0

super(A,self).test()表示:在self的方法解析順序(mro)之後調用對象的方法test

使用D.__mro__你看到的方法解析順序是:

<class '__main__.D'>, <class '__main__.A'>, <class '__main__.B'>, <type 'object'> 

所以Btest被調用。

在Python 3,你只需要鍵入super().test()和它你想要做什麼。在Python 2中,您需要鍵入:super(D,self).test()

0

通常,super會與當前類名稱一起被調用,並且讓python的MRO根據其遵循的算法來確定應調用哪個父類。所以你的代碼看起來是這樣的,你想要的行爲。

class D(A,B): 
    def test(self): 
     super(D,self).test() 

super(D,self).test()