2012-07-18 85 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()