Python继承类方法调用子类方法是否为预期稳定行为?
Python继承中父类方法调用子类重写方法的行为说明
这绝对是Python里预期且稳定的核心行为,完全符合Python面向对象的设计逻辑,咱们来一步步拆解清楚:
先看你的Python代码与实际运行结果
先把你的代码整理成更易读的格式:
class B(object): def test(self): self.call() def call(self): print("Call from B") if __name__ == "__main__": b = B() b.test() # 这里会输出 "Call from B" class C(B): def call(self): print("Call from C") if __name__ == "__main__": c = C() c.test() # 这里会输出 "Call from C"
你提到的运行结果只显示了Call from C,应该是只关注了子类实例的调用情况,实际父类实例调用也会正常输出父类的内容。
为啥父类的test会调用子类的call?
这要归功于Python的动态绑定(运行时绑定)特性:
当你在父类的test方法里写self.call()时,Python并不会在编译阶段就确定要调用父类的call方法。相反,它会在程序运行时,根据self的实际类型(也就是当前实例到底是B还是C)去查找对应的方法。
当你调用c.test()时,self指向的是C类的实例,Python会优先找C类里重写的call方法,自然就输出了Call from C。这种特性是Python实现多态的基础,是语言层面的设计,绝对稳定可靠。
和C++差异的根源
你在C里得到不同结果,是因为C默认是静态绑定:
如果父类的call方法没有被声明为virtual(虚函数),编译器在编译阶段就会直接把test里的call调用绑定到父类的版本,不管实际实例是子类还是父类。只有当你把父类的call声明为virtual,C++才会开启动态绑定,输出和Python一样的结果。
总结
这种行为在Python里是完全合规且稳定的,是Python面向对象编程的常规操作。你可以放心地在代码中依赖这个特性来实现多态逻辑,所有Python解释器(CPython、PyPy等)都会遵循这个规则。
内容的提问来源于stack exchange,提问作者鏉ㄥ槈杈�,python;inheritance"
相关产品推荐
相关产品推荐

