page contents

Python super() 你真的用对了吗?建议收藏

在平常工作中,阅读 Python 源码的时候是不是经常看到 super().__init__() 这行代码这行代码到底做什么用的?今天我们就来把 super() 从 0 到 1 讲清楚,保证你看完就能灵活用起来。

attachments-2025-09-G0XNLNQ568b64be252ced.png在平常工作中,阅读 Python 源码的时候是不是经常看到 super().__init__() 这行代码这行代码到底做什么用的?今天我们就来把 super() 从 0 到 1 讲清楚,保证你看完就能灵活用起来。

1-介绍

super() 是用来调用父类(或者更准确地说是 MRO 机制中下一个类)的方法的。比如之前我们写继承时,可能会这么写:

class Animal:

    def __init__(self, name):

        self.name = name


class Dog(Animal):

    def __init__(self, name, breed):

        Animal.__init__(self, name)  # 直接调用父类

        self.breed = breed

这样编写当然没问题,但是如果继承链很复杂,或者多重继承,你一个个去写父类名就很麻烦,而且容易搞出 BUG这时候,super() 就派上用场了

2-为什么使用 super()

使用 super() 主要有下面 3 种优势

• 简洁:不用重复写父类名字,改动父类名时不容易出错

• 安全:在多重继承里,它会自动按照 MRO(方法解析顺序)来调用下一个类的方法

• 可维护:别人接手你的代码时更容易看懂逻辑

简单来说,super() 是官方推荐的“优雅继承姿势”

3-MRO 背后的秘密

super() 为什么知道该调用哪个类?答案就是 MRO(Method Resolution Order)Python 在类的继承链中,有一套顺序规则,可以通过 类名.__mro__ 来查看源码比如:

class A:

    defshow(self):

        print("A")


classB(A):

    defshow(self):

        print("B")

        super().show()


classC(A):

    defshow(self):

        print("C")

        super().show()


classD(B, C):

    defshow(self):

        print("D")

        super().show()


print(D.__mro__)结果是:(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)

当我们调用 D().show() 时,执行顺序是:D → B → C → A → objectPS:super() 并不是单纯地找“父类”,而是按这个顺序从上往下找的

4-实战

我们先来看看单继承的情况代码如下:class Animal:

    def __init__(self, name):

        self.name = name


class Dog(Animal):

    def __init__(self, name, breed):

        super().__init__(name)  # 调用 Animal 的 __init__

        self.breed = breed


dog = Dog("旺财", "哈士奇")

print(dog.name, dog.breed)

输出结果:旺财 哈士奇

接着,我们继续看看多继承的情况代码如下:

class A:

    defsay(self):

        print("A")


classB(A):

    defsay(self):

        print("B")

        super().say()


classC(A):

    defsay(self):

        print("C")

        super().say()


classD(B, C):

    defsay(self):

        print("D")

        super().say()


d = D()

d.say()

结果如下:D B C A

PS:可以看出,super() 就是顺着 MRO 规则一步步往下运行的

5-最后

其实,super() 的核心作用就是调用 MRO 中下一个类的方法需要指出的是,super() 不等于 父类,它就是 MRO 的下一站所以,建议以后别写 父类.__init__() 了,用 super() 才是更 Pythonic 的正确打开方式!

更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1343 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 2180 文章
  3. Pack 1343 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章