【Python】super关键字

部署运行你感兴趣的模型镜像

📌1. super 的作用

super() 用来 调用父类(或兄弟类)的方法,而不用直接写父类名。

最典型的用法是:在子类重写了某个方法,但还想执行父类的方法逻辑:

class Animal:
    def speak(self):
        print("Animal makes a sound")

class Dog(Animal):
    def speak(self):
        super().speak()  # 调用父类的 speak()
        print("Dog barks")

dog = Dog()
dog.speak()
# 输出:
# Animal makes a sound
# Dog barks

📌2. 为什么不用直接写父类?

如果你写成 Animal.speak(self),确实也能调用,但有几个缺点:

不灵活:如果以后把父类换成了 Mammal,还要改所有 Animal.speak(self) 的地方。

多继承场景会出错:Python 支持多继承,直接写父类可能会破坏方法解析顺序(MRO),导致方法调用错乱。

📌3. super() 的工作原理(MRO)

super() 并不是“简单地找父类”,而是按照 方法解析顺序(MRO, Method Resolution Order) 查找下一个类。

示例:

class A:
    def show(self):
        print("A")

class B(A):
    def show(self):
        super().show()
        print("B")

class C(A):
    def show(self):
        super().show()
        print("C")

class D(B, C):
    def show(self):
        super().show()
        print("D")

d = D()
d.show()

print(D.__mro__)  # __mro__方法可以罗列D类的继承关系

# 输出:
# A
# C
# B
# D
# (<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)

这里 D 继承了 B 和 C,MRO 顺序是:

D → B → C → A → object

所以 super() 会按照 MRO 顺序依次调用下一个类的方法。

📌4. 在 init 里用 super

初始化对象时,子类经常需要先执行父类的初始化逻辑:

class Person:
    def __init__(self, name):
        self.name = name

class Student(Person):
    def __init__(self, name, student_id):
        super().__init__(name)  # 调用父类的 __init__
        self.student_id = student_id

📌5. 注意事项

推荐用 super() 而不是 super(Class, self)(Python3 已经简化了写法)。

多继承时必须配合 super() 才能保证每个父类只被调用一次。

super 调用的是 MRO 下一个类的方法,不一定是“父类”。

🎯总结

super() 用来调用 MRO 顺序中的下一个方法。

在 继承 + 重写 的场景下特别常用(比如 Django 的 init、save 方法)。

它比直接写父类名更安全,更适合多继承。

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

故林丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值