理解`super()`

news/2025/10/22 6:27:51/文章来源:https://www.cnblogs.com/wangya216/p/19156809

要理解super(),可以先记住它的核心作用:帮你找到“父类或兄弟类”的方法,尤其是当子类自己重写了某个方法,但你还想调用被重写的“原版”(父类或兄弟类的版本)时,就需要它。

先看个最简单的例子:单继承中用super()

比如你写了一个子类继承父类,子类重写了父类的方法,但想在子类方法里顺便调用一下父类的原版方法:

class 父类:def 打招呼(self):print("我是父类")class 子类(父类):def 打招呼(self):# 先调用父类的“打招呼”方法super().打招呼()  # 等价于 super(子类, self).打招呼()# 再加上子类自己的逻辑print("我是子类")obj = 子类()
obj.打招呼()
# 输出:
# 我是父类
# 我是子类

这里super()就相当于“父类的代理”,帮你找到父类的打招呼方法。不用显式写父类.打招呼(self),如果以后父类名字改了,super()的代码也不用动,更方便维护。

关键:super()按“MRO顺序”找方法

super()找方法不是瞎找的,而是按照“方法解析顺序(MRO)”来的。MRO就是一个类继承时,查找方法的固定顺序(可以通过类名.__mro__查看)。

比如有个复杂的继承关系:D继承B和C,B和C都继承A,它的MRO可能是:D -> B -> C -> A -> object(具体顺序Python会自动算)。

如果在B的方法里用super(),它会从MRO中B后面的类开始找,也就是先找C,再找A,最后找object

这一点在“多重继承”(一个类继承多个父类)时特别有用。比如多个父类有同名方法,super()会按MRO顺序依次调用,避免混乱(这就是文档说的“协作多重继承”)。

super()的参数怎么用?

super()可以带参数,也可以不带,最常用的是“不带参数”的情况:

  1. 零参数super()(最常用)
    只能在类的方法里用(比如实例方法、类方法)。此时Python会自动帮你填参数:

    • 对实例方法(比如def method(self): ...):super()等价于super(当前类, self)
    • 对类方法(比如@classmethod def cls_method(cls): ...):super()等价于super(当前类, cls)

    上面的例子里,子类打招呼方法中,super()就是自动绑定了当前类(子类)self(实例对象)

  2. 带两个参数super(type, obj_or_type)

    • 第一个参数type:指定从哪个类之后开始找(比如super(B, obj),就从MRO中B后面的类开始找)。
    • 第二个参数obj_or_type:如果是实例对象,必须是type的实例;如果是类,必须是type的子类。

    比如在上面的D->B->C->A例子中,想在D的方法里直接调用C的方法,可以用super(B, self).方法()(因为MRO中B后面是C)。

注意点

  • super()不仅能调用方法,还能找属性(比如父类的变量)。
  • 不要在嵌套函数(比如方法里再定义一个函数)里用零参数super(),可能会找错。
  • 多重继承时,super()的调用顺序完全依赖MRO,所以设计类时要保证同名方法的参数一致,否则可能出错。

总结

super()的核心是:按MRO顺序,帮你找到父类或兄弟类的方法/属性。单继承时,它就是“父类的快捷方式”;多重继承时,它能按规则协调多个父类的调用,避免混乱。用的时候记住:在类的方法里直接写super().xxx(),大部分情况都够用了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/942877.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分割模型 语言转分割CLIPSeg - MKT

分割模型 语言转分割CLIPSeg CLIPSeg 联合项目https://github.com/loki-keroro/SAMbase_segmentation?tab=readme-ov-file 自定义提示模型会根据不同的提示文本,生成不同的掩码,可修改main.py中的category_cfg变量…

在 Python 中,为什么说“一切皆对象”?

在 Python 中,“一切皆对象”是核心设计哲学,理解这一点能帮我们打通对 Python 语法的底层认知。下面结合具体问题详细解释: 一、为什么说 Python 中“一切皆对象”? 在 Python 中,所有能被“赋值给变量”或“作为…

C# Avalonia 16- Animation- SampleViewer - FollowExample

C# Avalonia 16- Animation- SampleViewer - FollowExampleFollowExample.axaml代码<UserControl xmlns="https://github.com/avaloniaui"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml&q…

五节课掌握 Python 面向对象(以“人狗大战”为例)

五节课掌握 Python 面向对象(以“人狗大战”为例) 第一节课:OOP 入门——创建“人”和“狗”的基本模型 目标:掌握类、对象、实例属性和方法的基础语法,能创建简单的“人”和“狗”并让它们执行基本动作。什么是面…

ESP32 Arduino核心框架:全面支持多款ESP32芯片的开发平台

ESP32 Arduino核心框架是专为ESP32系列芯片打造的官方开发平台,支持ESP32、ESP32-C3、ESP32-C6、ESP32-H2、ESP32-P4、ESP32-S2和ESP32-S3等多款芯片,提供完整的Arduino兼容API和丰富的硬件外设驱动。ESP32 Arduino核…

联邦学习与AI公平性研究新进展

某中心与南加州大学联合成立的机器学习安全与可信中心宣布首批博士研究员入选,重点研究联邦学习、分布式机器学习及机器学习公平性等前沿技术领域。某中心与南加州大学联合机器学习中心选拔首批博士研究员 南加州大学…

图像分割 3D-Box-Segment-Anything(5)如何加速 - MKT

图像分割 3D-Box-Segment-Anything(5)如何加速 1算法目前有多个针对速度优化的SAM变体版本,以下是主流的快速版SAM模型: 1. ​​MobileSAM​​ ⭐ 最推荐​​特点​​:将SAM的ViT-H图像编码器替换为更轻量的Tiny…

静态方法(`@staticmethod`)和类方法(`@classmethod`)的应用场景及选择原则

在 Python 中,静态方法(@staticmethod)和类方法(@classmethod)都属于“类级别的方法”,但适用场景有明确区别。以下从核心特性出发,详细说明两者的应用场景及选择原则: 一、静态方法(@staticmethod):与类/实…

专门针对无人机分割的预训练模型​ - MKT

专门针对无人机分割的预训练模型​ 公开可用的模型​​​​UAVid数据集预训练模型​​专门用于无人机城市场景理解 包含道路、建筑物、植被等类别 下载:GitHub搜索"UAVid-Semantic-Segmentation"​​DroneS…

为什么一般教材在讲解python的多态概念时,不用抽象基类及其相关内容讲解呢?

在讲解多态时较少优先用 Python 抽象基类(ABC,Abstract Base Class),核心原因是 ABC 并非 Python 多态的“主流或默认实现方式”,它更偏向“静态语言风格的补充工具”,而 Python 多态的本质是由动态类型和鸭子类…

[Bash] bash scripting common pitfalls

Absolutely — Bash feels strange because it blends shell commands, programming constructs, and POSIX quirks. If you come from Python, it’s easy to trip over hidden pitfalls. Here’s a thorough list, o…

[Bash]让人头晕的if条件

来自chatgptAh, yes — Bash’s conditional syntax is notoriously confusing because it has several different “types” of tests, and each has subtle differences. Let’s break it down carefully. You were …

鸭子类型(Duck Typing)中的“类型”,指的是什么的类型?为什么很多人认为“Python 没有真正实现多态”?多态的核心目的是什么?鸭子类型如何实现多态?

鸭子类型(Duck Typing)中的“类型”,指的是什么的类型? 鸭子类型(Duck Typing)中的“类型”,指的是“具备特定行为的对象的类型”——它不是传统意义上“由类定义的类型”(如 int、str 或自定义类),而是“由…

tryhackme-预安全-windows基础-windows 基础知识1-16

tryhackme-Pre Security-Windows Fundamentals -Windows Fundamentals 1 房间地址:https://tryhackme.com/room/windowsfundamentals1xbx 这是网络安全入门的基础模块的计算机科学基础知识:Windows Fundamentals 1(…

YOLO11深度学习的遥感视角地面房屋建筑检测分割与分析系统 - MKT

YOLO11深度学习的遥感视角地面房屋建筑检测分割与分析系统 https://blog.csdn.net/qq_42589613/article/details/146162941一、软件核心功能介绍及效果演示软件主要功能1. 可进行遥感视角地面房屋建筑检测分割,分割一…

鸭子类型(Duck Typing)中的“类型”,指的是什么的类型?为什么很多人认为“Python 没有真正实现多态”

鸭子类型(Duck Typing)中的“类型”,指的是“具备特定行为的对象的类型”——它不是传统意义上“由类定义的类型”(如 int、str 或自定义类),而是“由对象具备的方法/属性(行为)所定义的逻辑类型”。简单说:“…

图像分割 Segment Anything(1-2)第二代 - MKT

图像分割 Segment Anything(1-2)第二代 大模型 8秒 1800*1200 压缩一半# 使用前需要先安装 SAM 2。代码需要python>=3.10、 以及torch>=2.5.1和。请按照此处的torchvision>=0.20.1说明安装 PyTorch 和 Tor…

对比c++中的多态和python的多态

C++ 和 Python 中的“多态”都围绕“同一接口、不同实现”的核心思想,但由于语言特性(静态类型 vs 动态类型)的差异,两者在实现方式、约束性、灵活性上有显著区别。以下从核心机制、实现条件、使用场景等维度对比:…

OAK-D-SR近红外相机 - MKT

OAK-D-SR近红外相机 https://www.oakchina.cn/2024/08/13/%E5%85%B7%E6%9C%89-sam2-%E5%88%86%E6%AE%B5%E7%9A%84-ndvi-%E6%97%A0%E4%BA%BA%E6%9C%BA/

结对项目-自动生成小学四则运算题目命令行程序

(一)这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience/homework/13479这个作业的…