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

