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

为何在Python中使用super()调用父类函数?

关于子类重写方法中使用super()的疑问

问题背景

我正在钻研元类,回头复习super()和type的相关知识时,看到这么个示例代码:

class Animals:
    # 初始化构造函数
    def __init__(self):
        self.legs = 4
        self.domestic = True
        self.tail = True
        self.mammals = True

    def isMammal(self):
        if self.mammals:
            print("It is a mammal.")

    def isDomestic(self):
        if self.domestic:
            print("It is a domestic animal.")

class Dogs(Animals):
    def __init__(self):
        super().__init__()

    def isMammal(self):
        super().isMammal()  # 为什么要这么做?

我理解继承父类时,调用super().__init__()是为了完成父类的初始化,但普通方法明明可以直接继承,为什么还要在重写的方法里调用super().isMammal()?难道是为了在修改逻辑的同时保留父类方法的行为?另外,为什么不直接像下面这样调用?

def mammal_can_dance(self):
    self.isMammal()
    print("and can dance")

核心原因拆解

  • 重写时保留父类原有逻辑:子类重写父类方法后,默认会完全覆盖父类的实现。用super().isMammal()的核心目的,就是在子类自定义逻辑的同时,还能执行父类原有的方法代码。比如后续如果要给Dogs的isMammal加额外输出,可以这么写:

    def isMammal(self):
        super().isMammal()
        print("This is a dog, a type of mammal.")
    

    这样既会输出父类的"It is a mammal.",又能输出子类的额外内容,实现逻辑的叠加。

  • 避免递归调用陷阱:你写的self.isMammal()存在明显问题——因为Dogs已经重写了isMammal方法,调用self.isMammal()会触发无限递归,最终导致栈溢出错误。而super()会明确指向父类的方法,完全不会有这个问题。

  • 适配多继承的灵活性:如果后续涉及多继承场景(比如Dogs同时继承多个类),super()会按照Python的MRO(方法解析顺序)自动找到正确的父类方法。要是用硬编码的方式直接调用Animals.isMammal(self),会破坏多继承的逻辑,后续维护时很容易出错。

内容的提问来源于stack exchange,提问作者linkey apiacess

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 08:18:20