Python中内置函数super()用法示例详解

 更新时间:2026年01月27日 11:58:23   作者:MediaTea  
这篇文章主要介绍了Python中内置函数super()用法的相关资料,super()函数的主要作用是调用父类(超类)以及多层父类中的方法,这对于访问已在类中重写的继承方法很有用,文中通过代码介绍的非常详细,需要的朋友可以参考下

前言

在面向对象编程中,类常有继承关系,子类需要复用或扩展基类逻辑。Python 提供内置函数 super(),返回一个代理对象,用于按 MRO(方法解析顺序) 调用当前类之后的下一个类的方法。这样可以避免硬编码父类名,使代码在多继承下更健壮、可维护。

一、函数语法

super([type[, object-or-type]])

参数:

  • type:可选。通常为当前类。
  • object-or-type:可选。当前实例(self)或当前类(配合类方法/静态方法显式传入)。

常见写法:

🔹实例方法

super().method(...)

# 等价于:
super(CurrentClass, self).method(...)

🔹类方法

@classmethod
def m(cls, ...):
    super().method(...)

# 等价于:
super(CurrentClass, cls).method(...)

返回值:

一个 super 代理对象,可用于调用 MRO 中“当前类之后的下一个类” 的方法。

提示:

Python 3 支持零参 super()。单参形式很少需要,一般用零参或两参。

二、基础用法示例

1、基本继承调用

class Parent:
    def greet(self):
        print("Hello from Parent")

class Child(Parent):
    def greet(self):
        super().greet()   # 调用父类方法
        print("Hello from Child")

c = Child()
c.greet()

# Hello from Parent
# Hello from Child

2、构造函数链

class A:
    def __init__(self):
        print("A init")

class B(A):
    def __init__(self):
        super().__init__()  # 调用 A.__init__()
        print("B init")

b = B()
# A init
# B init

三、进阶技巧

1、多继承与 MRO(方法解析顺序)

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

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

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

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

d = D()
d.greet()

# A
# C
# B
# D

MRO 顺序:D → B → C → A → object。

super() 并非“父类调用”,而是沿 MRO 从当前类的后继继续向上。

2、显式两参 super()

当你不在方法定义的典型上下文(或需要手动指明上下文)时,可显式传入两参:

class Base:
    def who(self): print("Base.who")

class Sub(Base):
    def who(self):
        print("Sub.who → call super:")
        return super(Sub, self).who()

Sub().who()
# Sub.who → call super:
# Base.who

3、类方法与静态方法

类方法可直接零参 super()(因为有 cls):

class A:
    @classmethod
    def hello(cls):
        print("A hello")

class B(A):
    @classmethod
    def hello(cls):
        super().hello()
        print("B hello")

B.hello()

# A hello
# B hello

静态方法中没有隐式的 self/cls,零参 super() 不可用。但可以显式两参使用(调用无需实例的方法):

class A:
    @classmethod
    def ping(cls): print("A.ping")

class B(A):
    @staticmethod
    def call_ping():
        # 显式指定当前类与类型参数
        super(B, B).ping()

B.call_ping()
# A.ping

若要在静态方法中调用需要实例的方法,你必须自备实例并作为第二参传入(或改为实例/类方法设计)。

四、补充说明与常见误区

1、误把 super() 当“父类调用”

它依赖 MRO,是当前位置之后的下一个类;多继承下若某类不调用 super(),调用链会被中断。

2、静态方法并非完全不能 super()

不能用零参,但可以显式两参(见上例)。关键是你是否有合适的第二参数以及要调用的是否为可在该上下文调用的方法(如 @classmethod)。

3、签名与参数传递

在 __init__ 或其他需要链式调用的方法中,建议:

def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)

以免在多继承组合时出现参数不匹配。

小结

super() 返回一个基于 MRO 的代理,不是“直接父类”的别名。

零参 super() 适用于实例方法与类方法;在静态方法或特殊上下文中,可用显式两参。

在多继承中配合合作式 super() 与一致的参数传递,能保证方法/构造链完整运行,避免菱形继承中的重复与遗漏。

到此这篇关于Python中内置函数super()用法的文章就介绍到这了,更多相关Python内置函数super()内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python中pivot()函数基础知识点

    python中pivot()函数基础知识点

    在本篇内容里小编给大家分享的是一篇关于python中pivot()函数基础知识点内容,对此有兴趣的朋友们可以参考学习下。
    2021-01-01
  • numpy.random.shuffle打乱顺序函数的实现

    numpy.random.shuffle打乱顺序函数的实现

    这篇文章主要介绍了numpy.random.shuffle打乱顺序函数的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • PyCharm中的库Flask安装以及如何使用详解

    PyCharm中的库Flask安装以及如何使用详解

    在学习flask的过程中关于flask安装的过程中遇到了很多的问题,通过自己的摸索和搜寻最终终于能够成功运行,下面这篇文章主要给大家介绍了关于PyCharm中库Flask安装以及如何使用的相关资料,需要的朋友可以参考下
    2023-12-12
  • python打开文件的方式有哪些

    python打开文件的方式有哪些

    在本篇文章里小编给大家分享了关于python打开文件的方式,需要的朋友们可以学习参考下。
    2020-06-06
  • 一文全面理解Python中的模块Module

    一文全面理解Python中的模块Module

    模块(Module)是包含Python定义和语句的文件,用于将相关代码组织在一起,实现代码的复用性和可维护性,这篇文章主要介绍了Python中模块Module的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2026-01-01
  • Python使用PyMuPDF(fitz)处理PDF文档的操作指南

    Python使用PyMuPDF(fitz)处理PDF文档的操作指南

    在Python中,PyMuPDF 是一个功能强大且高效的库,用于处理多种文档格式,尤其是PDF,它基于 MuPDF 引擎,提供了丰富的功能,包括文档的读取、写入、修改、渲染和文本提取等,以下是一些关键用法和示例代码,需要的朋友可以参考下
    2025-07-07
  • Python正则表达式急速入门(小结)

    Python正则表达式急速入门(小结)

    这篇文章主要介绍了Python正则表达式急速入门(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • 使用pytorch实现线性回归

    使用pytorch实现线性回归

    这篇文章主要为大家详细介绍了使用pytorch实现线性回归,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • Python+LyScript实现自定义反汇编

    Python+LyScript实现自定义反汇编

    LyScript 插件默认提供了一个get_disasm_code()方法可以直接获取到指定行数的反汇编代码。本文将利用LyScript实现自定义反汇编,感兴趣的可以了解一下
    2022-07-07
  • python机器学习sklearn实现识别数字

    python机器学习sklearn实现识别数字

    本文主要介绍了python机器学习sklearn实现识别数字,主要简述如何通过sklearn模块来进行预测和学习,最后再以图表这种更加直观的方式展现出来,感兴趣的可以了解一下
    2022-03-03

最新评论