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
相关产品推荐
相关产品推荐

