这对我来说似乎很混乱。 有人可以解释为什么这个未知的神奇事物会发生吗?
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
您的回答将不胜感激。谢谢。
答案 0 :(得分:1)
在A.testA
中,您拨打self.testB
。这意味着为当前实例调用testB
的“叶子”定义。由于self
是testB
的实例,因此会调用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
会忽略它们的覆盖并继续调用相反,它是自己的版本。