使用super时调用Derived类方法的基类方法。非常困惑

时间:2013-05-10 06:56:05

标签: python super

这对我来说似乎很混乱。 有人可以解释为什么这个未知的神奇事物会发生吗?

class A(object):
    def testA(self):
        print "TestA of A"
        self.testB()

    def testB(self):
        print "TestB of A"

class B(A):
    def testA(self):
        super(B, self).testA()
        print "TestA of B"
        self.testB()

    def testB(self):
        print "TestB of B"

if __name__ == '__main__':
    test = B()
    test.testA()
    Program Output:
    ===============
    TestA of A
    TestB of B --> Why it is calling derived class method ?
    TestA of B
    TestB of B

    Expected Output:
    ================
    TestA of A
    TestB of A -- I want to see A here.
    TestA of B
    TestB of B

您的回答将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:1)

A.testA中,您拨打self.testB。这意味着为当前实例调用testB的“叶子”定义。由于selftestB的实例,因此会调用B.testB

即使您在类self.testB上定义的方法中编写了A,但这并不意味着它将调用类A上定义的方法的版本。您正在实例上调用该方法,并且在运行时,实例的类是动态确定的,并且在实例上定义的任何方法都将运行。由于实例属于类B,而类B会覆盖testA,因此实例的testA版本是B提供的版本。

如果您要在A.testA中呼叫A.testB,则必须通过调用A.testB(self)明确地执行此操作。但是,您应该考虑为什么要这样做。重写方法的重点在于您可以更改类的工作方式。 A不应该知道调用哪个版本的testB。它应该只需要知道它正在调用一个名为testB的方法,该方法可以执行在程序/库中记录的方法testB。如果A明确要求调用自己的testB方法,则这会使子类难以改变testB的行为,因为A会忽略它们的覆盖并继续调用相反,它是自己的版本。