5

我有 3 个 A、B 和 D 类,如下所示

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()B.test()为什么即使方法也存在也只调用A.test()

4

3 回答 3

6

因为你告诉它不要。在D.test您告诉它调用 A 的级的测试方法时-就是这样super做的。

通常你想在super调用中使用当前的类名。

于 2012-07-18T18:15:46.000 回答
0

通常使用当前类名调用 super 并且您让 python 的 MRO 根据它遵循的算法来处理它应该调用哪个父类。因此,对于您想要的行为,您的代码将如下所示。

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

笔记super(D,self).test()

于 2012-07-18T19:09:09.993 回答
0

super(A,self).test()意思是:test在 Aself的方法解析顺序 (mro) 之后调用对象的方法。

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

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

所以称为testB

在 Python 3 中,您只需键入super().test(),它就会执行您想要的操作。在 Python 2 中,您需要键入:super(D,self).test()

于 2012-07-18T18:57:17.020 回答