0

这对我来说似乎很困惑。有人可以解释为什么会发生这种未知的神奇事情吗?

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()
    程序输出:
    ================
    A的测试A
    B的TestB --> 为什么调用派生类方法?
    B测试A
    B的测试B

    预期输出:
    =================
    A的测试A
    A 的 TestB -- 我想在这里看到 A。
    B测试A
    B的测试B

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

4

1 回答 1

1

A.testA,你打电话self.testB。这意味着调用testB当前实例的“叶子”定义。由于self是 的实例testB,因此它调用B.testB.

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

如果A.testA你想调用A.testB,你必须通过调用明确地做到这一点A.testB(self)。但是,您应该考虑为什么要这样做。重写方法的全部意义在于您可以更改类的执行方式。 A不需要知道testB调用的是哪个版本。它应该只需要知道它正在调用一个调用的方法testB,该方法testB执行您的程序/库中记录的方法。如果A特别需要调用它自己的testB方法,这使得子类很难改变 的行为testB,因为A将忽略它们的覆盖并继续调用它自己的版本。

于 2013-05-10T07:01:41.763 回答