You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:50:40