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

Python继承中self调用疑问:父类self.baz为何触发子类方法?

Python继承中self调用子类方法的原因及解决方案

为什么Foo类中的self.baz会调用Bar的baz方法?

在Python中,方法调用是基于实例的实际类型进行动态解析的,而不是看调用代码写在哪个类里。

当你创建Bar实例并调用baz(3)时,整个调用链中的self始终指向这个Bar对象。即使在Foo类的baz方法里执行self.baz(num-1),Python会优先在Bar类中查找baz方法(因为self是Bar实例),而Bar已经重写了baz,所以最终调用的是子类的方法,这就是为什么输出会出现Sub: 1。

如何让Foo类强制调用自身的baz方法?

要让Foo类在任何情况下都调用自己的baz方法,你可以直接通过Foo类名来限定方法调用,而不是依赖self的动态解析。修改Foo类的代码如下:

class Foo:
    def baz(self, num):
        if num <= 0:
            return

        print(f"Base: {num}")
        # 直接调用Foo类的baz方法,传入self作为第一个参数
        Foo.baz(self, num - 1)


class Bar(Foo):
    def baz(self, num):
        if num <= 0:
            return

        print(f"Sub: {num}")
        super().baz(num - 1)


Bar().baz(3)

修改后的代码运行后会输出你预期的结果:

Sub: 3
Base: 2
Base: 1

这种方式跳过了动态方法查找,直接指定调用Foo类的baz方法,确保无论self是什么类型的实例,都能执行父类的实现。

内容的提问来源于stack exchange,提问作者Josh Clark

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 02:35:40