当前位置: 首页 > news >正文

python继承中super() 不是简单的“调用父类”,而是调用 MRO 里的下一个类

Python 里的一个类可以同时继承多个父类。这让我们的模型设计变得更灵
活,但同时也带来一个新问题:“在复杂的继承关系下,如何确认子类的
某个方法会用到哪个父类?”

这里有点需要理解:

  1. MRO(方法解析顺序) —— 当一个类有多个父类时,Python 是按照某种规则(MRO)来决定调用哪个父类的方法的。
  2. super() 的行为 —— super() 并不是简单调用“父类”的方法,而是按照 MRO 的顺序找到“下一个”类的方法。

一、MRO(方法解析顺序)

在 Python 里,一个类可以继承多个父类(多重继承)。但这样会带来一个问题:

如果多个父类里有同名的方法,Python 应该优先调用哪个?

Python 通过 MRO(方法解析顺序) 解决这个问题。MRO 确定了方法的查找顺序,也就是当你调用 obj.method() 时,它会按照 MRO 里的顺序 找到第一个定义了 method() 的类。


🔹 示例 1:理解 MRO 的查找顺序

class A:def say(self):print("I'm A")class B(A):passclass C(A):def say(self):print("I'm C")class D(B, C):  # D 同时继承 B 和 Cpassprint(D.mro())  # 查看 MRO 顺序
D().say()  # 调用 say() 方法

输出:

[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]
I'm C

解释:

  • MRO 计算出的查找顺序是 D → B → C → A → object
  • D 里没有 say() 方法,就去找 B
  • B 也没有 say(),继续往下找 C
  • C 里有 say(),所以调用的是 C.say(),而 A.say() 被跳过了。

📌 关键点:MRO 采用 C3 线性化算法,主要遵循**“从左到右优先”**,也就是 D(B, C)B 比 C 优先,但如果 B 里没有 say(),就继续往后找 C


二、super() 的行为

很多人以为 super() 只是调用“父类”的方法,但其实它是按 MRO 顺序寻找“下一个类”,而不一定是“直接的父类”!


🔹 示例 2:super() 的 MRO 查找顺序

class A:def __init__(self):print("I'm A")super().__init__()class B(A):def __init__(self):print("I'm B")super().__init__()class C(A):def __init__(self):print("I'm C")super().__init__()class D(B, C):  # D 继承 B 和 CpassD()  # 实例化 D

输出:

I'm B
I'm C
I'm A

解释:

  • D 里没有 __init__(),所以会调用 B.__init__()(因为 MRO 里 BC 前面)。
  • B.__init__() 里调用 super().__init__(),MRO 里 B 后面是 C,所以 super() 进入 C.__init__()
  • C.__init__() 里也有 super().__init__(),MRO 里 C 后面是 A,所以最终调用 A.__init__()

📌 关键点super() 调用的不是“父类”,而是 MRO 里的下一个类,所以 Bsuper() 其实是调用 C.__init__(),而不是 A.__init__()


三、为什么多重继承容易出问题?

多重继承虽然强大,但如果不小心设计,很容易导致 MRO 复杂,代码难以维护

🔹 示例 3:设计不好的多重继承

class Animal:def move(self):print("Animal is moving")class Flyable:def move(self):print("Flying in the sky")class Bird(Animal, Flyable):passb = Bird()
b.move()  # 你觉得会输出什么?

输出:

Animal is moving

问题

  • Bird 继承了 AnimalFlyable,但 Animalmove() 覆盖了 Flyablemove(),所以 Bird().move() 只会执行 Animal.move()
  • 这个设计就会让 Bird 不能“飞”,不符合直觉。

📌 如何解决?
可以用 super()move() 遵循 MRO 顺序:

class Animal:def move(self):print("Animal is moving")super().move()  # 继续往 MRO 里的下一个类找class Flyable:def move(self):print("Flying in the sky")class Bird(Animal, Flyable):passb = Bird()
b.move()

输出:

Animal is moving
Flying in the sky

解决方式:

  • Animal.move() 先执行完自己的逻辑,再 super().move(),调用 MRO 里的下一个 Flyable.move()

四、总结

  1. MRO(方法解析顺序) 决定了多重继承下方法的调用顺序,MRO 通过 C3 线性化算法 计算出来。
  2. super() 不是简单的“调用父类”,而是调用 MRO 里的下一个类,这意味着它会受到 MRO 的影响。
  3. 多重继承可能导致意外的行为,尤其是在多个父类里有相同的方法时。
  4. 在使用 super() 时,建议所有父类的方法都调用 super(),避免意外跳过某些方法。
  5. 如果发现自己用多重继承写了很复杂的 MRO 逻辑,应该考虑是否能用更简单的方式(如组合)来解决问题

五、建议

不要 过度使用多重继承,除非你真的需要它。
可以 考虑用 接口(Protocol)、组合(Composition) 来代替复杂的继承结构。
如果必须用多重继承,一定要理解 MRO 和 super() 的行为,否则容易踩坑。

相关文章:

python继承中super() 不是简单的“调用父类”,而是调用 MRO 里的下一个类

Python 里的一个类可以同时继承多个父类。这让我们的模型设计变得更灵 活&#xff0c;但同时也带来一个新问题&#xff1a;“在复杂的继承关系下&#xff0c;如何确认子类的 某个方法会用到哪个父类&#xff1f;” 这里有点需要理解&#xff1a; MRO&#xff08;方法解析顺序…...

【智慧校园】分体空调节能监管:打造高效节能的学习环境

随着科技的飞速发展和生活品质的不断提升&#xff0c;人们对于家居和办公环境的舒适度与智能化要求也越来越高。分体空调集中控制系统作为一种先进的空调管理方式&#xff0c;正逐渐成为现代家庭和办公场所的标配&#xff0c;为用户带来更加便捷、高效和节能的空调使用体验。随…...

【达梦数据库】dblink连接[SqlServer/Mysql]报错处理

目录 背景问题1&#xff1a;无法测试以ODBC数据源方式访问的外部链接!问题分析&原因解决方法 问题2&#xff1a;DBLINK连接丢失问题分析&原因解决方法 问题3&#xff1a;DBIINK远程服务器获取对象[xxx]失败,错误洋情[[FreeTDS][SQL Server]Could not find stored proce…...

STM32 ADC介绍(硬件原理篇)

目录 背景 AD转换器 采样与保持 量化 编码 AD转换器转换原理 DA转换原理 AD转换原理 1.逐次逼近型AD转换器 2.并联比较型AD转换器 编码器 同步D触发器和边沿D触发器 基本RS触发器 同步RS触发器 同步D触发器 边沿型D触发器&#xff08;维持-阻塞D触发器&#xff…...

蚁剑(AutSword)的下载安装与报错解决

蚁剑&#xff08;AutSword&#xff09;的下载安装与报错解决 1.下载 唯一官方github下载地址 GitHub - AntSwordProject/AntSword-Loader: AntSword 加载器 2.安装 打开并且进入到下面的界面 下载需要的的版本 进行初始化 3.报错 出现下面的报错 4.解决方法 出现上面报错…...

BT401双模音频蓝牙模块如何开启ble的透传,有什么注意事项

BT401音频蓝牙模块如何开启ble的透传&#xff1f; 首先BT401的蓝牙音频模块&#xff0c;分为两个版本&#xff0c;dac版本和iis数字音频版本 DAC版本&#xff1a;就是BT401蓝牙模块【9和10脚】直接输出模拟音频信号&#xff0c;也就是说&#xff0c;直接推动耳机可以听到声音 …...

209. 长度最小的子数组

这个题目之前做过是用c语言写的 但是我这里用python来写 写的不是很好 感觉自己这里写的还是有问题 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;…...

使用IDEA创建Maven项目、Maven坐标,以及导入Maven项目

一、创建Maven项目 正如使用Vue创建工程化的前端项目&#xff0c;此时&#xff0c;使用Maven创建标准化的后端项目。 以下适用于2021版本的IDEA。 name和artifactid会自动保持一致。 Groupid&#xff1a;一般写公司域名倒写&#xff0c;再加上项目名&#xff08;也可以不…...

从零到一实现微信小程序计划时钟:完整教程

在本教程中&#xff0c;我们将一起实现一个微信小程序——计划时钟。这个小程序的核心功能是帮助用户添加任务、设置任务的时间范围&#xff0c;并且能够删除和查看已添加的任务。通过以下步骤&#xff0c;我们将带你从零开始实现一个具有基本功能的微信小程序计划时钟。 项目…...

最长回文子串(蓝桥云课)

题目链接&#xff1a;8.最长回文子串 - 蓝桥云课 (lanqiao.cn) 代码如下 # include <iostream> # include <cstring> using namespace std; int main() {string str;getline(cin, str);int res 0;for(int i 0; i < str.length(); i){int l i - 1, r i 1;…...

12-滑动窗口

一&#xff0c;定义 滑动窗口算法是一种用于处理数组或字符串问题的技巧&#xff0c;特别适合解决涉及子数组或子串的问题。它的核心思想是通过维护一个“窗口”来高效地计算或查找满足条件的子数组或子串。 基本概念 窗口&#xff1a;窗口是数组或字符串中的一个连续子区间&a…...

时间序列分析(五)——移动平均模型(MA模型)

此前篇章&#xff1a; 时间序列分析&#xff08;一&#xff09;——基础概念篇 时间序列分析&#xff08;二&#xff09;——平稳性检验 时间序列分析&#xff08;三&#xff09;——白噪声检验 时间序列分析&#xff08;四&#xff09;——差分运算、延迟算子、AR(p)模型 …...

eNSP防火墙综合实验

一、实验拓扑 二、ip和安全区域配置 1、防火墙ip和安全区域配置 新建两个安全区域 ip配置 Client1 Client2 电信DNS 百度web-1 联通DNS 百度web-2 R2 R1 三、DNS透明代理相关配置 1、导入运营商地址库 2、新建链路接口 3、配置真实DNS服务器 4、创建虚拟DNS服务器 5、配置D…...

ES8字符串填充用法总结:padStart(),padEnd(),rest剩余参数的用法{name,...obj},扩展运算符的用法,正则表达式命名捕获组

ES8&#xff08;ECMAScript 2017&#xff09;引入了两个非常有用的字符串填充方法&#xff1a;padStart() 和 padEnd()&#xff0c;它们可以用来在字符串的两端添加指定的填充字符&#xff0c;从而达到指定的字符串长度。这些方法非常适合用于格式化文本和对齐输出。 1. padSt…...

Redis 统计每个数据类型中占用内存最多的前 N 个 bigkey

Redis 统计每个数据类型中占用内存最多的前 N 个 bigkey import redisdef find_bigkeys(hostlocalhost, port6379, db0, n10):r redis.Redis(hosthost, portport, db0)bigkeys {}# 用于存储每种数据类型的键及内存占用type_memory_dict {}# 扫描所有键for key in r.scan_it…...

C++中的.*运算符

看运算符重载的时候&#xff0c;看到这一句 .* :: sizeof ?: . 注意以上5个运算符不能重载。 :: sizeof ?: . 这四个好理解&#xff0c;毕竟都学过&#xff0c;但.*是什么&#xff1f; 于是自己整理了一下 .* 是一种 C 中的运算符&#xff0c;称为指针到成…...

大语言模型简史:从Transformer(2017)到DeepSeek-R1(2025)的进化之路

2025年初&#xff0c;中国推出了具有开创性且高性价比的「大型语言模型」&#xff08;Large Language Model — LLM&#xff09;DeepSeek-R1&#xff0c;引发了AI的巨大变革。本文回顾了LLM的发展历程&#xff0c;起点是2017年革命性的Transformer架构&#xff0c;该架构通过「…...

14-H指数

给你一个整数数组 citations &#xff0c;其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。 根据维基百科上 h 指数的定义&#xff1a;h 代表“高引用次数” &#xff0c;一名科研人员的 h 指数 是指他&#xff08;她&#xff09;至少发…...

Param ‘serviceName‘ is illegal, serviceName is blank

今天测试nacos服务配置拉取时报了这样一个错误&#xff0c;发现是spring.application.name空值造成的&#xff0c;但是我的bootstrap.yml文件明明配置了&#xff0c;难不成是没有加载bootstrap.yml文件&#xff1f;于是我引入了下面的依赖 <dependency><groupId>o…...

深入剖析Spring MVC

一、Spring MVC 概述 1. 什么是 Spring MVC&#xff1f; Spring MVC 是基于 Spring 框架的 Web 框架&#xff0c;它实现了 MVC 设计模式&#xff0c;将应用程序分为三个核心部分&#xff1a; Model&#xff1a;封装应用程序的数据和业务逻辑。 View&#xff1a;负责渲染数据…...

LLM:RAG

原文链接&#xff1a;LLM&#xff1a;RAG 1、RAG 概览 RAG&#xff08;Retrieval-Augmented Generation&#xff0c;检索增强生成&#xff09;是一种结合了信息检索&#xff08;IR&#xff09;和 LLM 的技术。它的核心思想是在 LLM 生成回答之前&#xff0c;通过检索相关文档…...

Linux 信号量

Linux 信号量 一、信号量基础概念1.1 同步机制的核心需求1.2 信号量的核心原理1.3 信号量类型对比 二、实战代码解析2.1 共享内存与信号量结合示例2.2 信号量类实现要点 三、关键实现细节分析3.1 初始化三步骤3.2 SEM_UNDO机制3.3 原子操作保证 四、进阶应用场景4.1 生产者-消费…...

如何优化Spark作业的性能

优化Spark作业的性能是一个综合性的任务&#xff0c;涉及多个方面的调整和优化。以下是一些关键的优化策略&#xff1a; 一、开发调优 避免创建重复的RDD&#xff1a; 对于同一份数据&#xff0c;只应该创建一个RDD&#xff0c;避免多次创建RDD来增加性能开销。在对不同的数据…...

ERP对制造业务有何价值?

ERP 的定义 在定义 ERP 之前&#xff0c;我们先从其首字母缩写说起&#xff0c;ERP 代表企业资源规划。我们可以将 ERP 定义为一种企业软件&#xff0c;它帮助组织管理日常业务。从根本上讲&#xff0c;ERP 将客户管理、人力资源、商业智能、财务管理、库存以及供应链功能整合…...

python和pycharm 和Anaconda的关系

好的&#xff0c;下面我会详细说明 Python、PyCharm 和 Anaconda 三者的关系&#xff0c;并逐一解释它们的功能和作用。 1. Python&#xff08;编程语言&#xff09; 定义&#xff1a;Python 是一种高级编程语言&#xff0c;设计简洁&#xff0c;易于学习&#xff0c;且功能强…...

网络安全“挂图作战“及其场景

文章目录 一、网络安全挂图作战来源与定义1、网络安全挂图作战的来源2、网络安全挂图作战的定义 二、挂图作战关键技术三、挂图作战与传统态势感知的差异四、挂图作战主要场景五、未来趋势结语 一、网络安全挂图作战来源与定义 1、网络安全挂图作战的来源 网络安全挂图作战的…...

【对比】Pandas 和 Polars 的区别

Pandas vs Polars 对比表 特性PandasPolars开发语言Python&#xff08;Cython 实现核心部分&#xff09;Rust&#xff08;高性能系统编程语言&#xff09;性能较慢&#xff0c;尤其在大数据集上&#xff08;内存占用高&#xff0c;计算效率低&#xff09;极快&#xff0c;利用…...

投资组合风险管理

投资组合风险管理 市场风险 信用风险流动性风险风险指标收益率波动率最大回撤 α \alpha α&#xff08;詹森指数&#xff09;&#xff0c; β \beta β卡玛比率月胜率上/下行捕获比夏普比率索提诺比率经风险调整的收益率&#xff08;&#x1d440;2&#xff09;特雷诺比率信息…...

用 WOW.js 和 animate.css 实现动画效果

用 wow.js 就可以实现动画效果&#xff0c;但由于里面的动画样式太少&#xff0c;一般还会引入 animated.css 第一步&#xff1a;下载 选择合适的包管理器下载对应的内容 pnpm i wow.js animated.css --save 第二步&#xff1a;引入 在main.js中加入&#xff1a; import …...

2024年职高单招或高考计算机类投档线

问题&#xff1a; 这些学校2024年职高单招或高考计算机类投档线分别是多少 回答&#xff1a; 部分学校2024年职高单招或高考计算机类投档线如下&#xff1a; 湖南工业职业技术学院 职高单招&#xff1a;未查询到2024年职高单招计算机类专业明确的录取分数线信息。但在2024年…...

洛谷P11042 [蓝桥杯 2024 省 Java B] 类斐波那契循环数

像是这种填空题的话&#xff0c;就直接暴力还更加省时间&#xff0c;在本地算完后直接提交答案即可 #include<bits/stdc.h> using namespace std;const int N 10000000;bool isnumber(int n) {vector<int> a;int m n;while (n > 0) {a.push_back(n % 10);n / …...

[LeetCode]day25 151.翻转字符串里的单词

题目链接 题目链接 给你一个字符串 s &#xff0c;请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。 注意&#xff1a;输入字符串 s中可能…...

2026考研趋势深度解析:政策变化+高效工具指南

2026考研深度解析&#xff1a;趋势洞察高效工具指南&#xff0c;助你科学备战上岸 从政策变化到工具实战&#xff0c;这份千字攻略解决99%考生的核心焦虑 【热点引入&#xff1a;考研赛道进入“高难度模式”】 2025年全国硕士研究生报名人数突破520万&#xff0c;报录比预计扩…...

【软考】【2025年系统分析师拿证之路】【啃书】第十一章 软件需求工程(十二)

目录 需求的层次需求工程的主要活动需求的记录技术需求分析需求定义 需求的层次 业务需求用户需求系统需求 需求工程的主要活动 需求获取需求分析形成需求规格需求确认和验证需求管理 需求的记录技术 任务卡片场景说明用户故事 需求分析 方法&#xff1a; 结构化分析&a…...

Cherry Studio 接入本地ollama 搭建可视化deepseek

本文介绍本地下载ollama 后&#xff0c;在cherry studio 中添加本地ollama 查看本地deepseek 模型列表 ollama list 运行模型 ollama run deepseek-r1 验证可以选用ollama 模型...

MapReduce远程调试

个人博客地址:MapReduce远程调试 | 一张假钞的真实世界 MR的远程调试分为两个方面: MapReduce Task远程调试AM(Application Master)远程调试MapReduce Task远程调试 Map Task远程调试 修改mapred-site.xml中的配置项: mapreduce.map.java.opts:Map Task JVM参数设置。…...

知识拓展:设计模式之装饰器模式

装饰器模式拓展 1. 什么是装饰器模式&#xff1f; 装饰器模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其结构。装饰器模式通过创建一个装饰类来包装原始类&#xff0c;从而在不修…...

【深度学习】计算机视觉(CV)-目标检测-DETR(DEtection TRansformer)—— 基于 Transformer 的端到端目标检测

1.什么是 DETR&#xff1f; DETR&#xff08;DEtection TRansformer&#xff09; 是 Facebook AI&#xff08;FAIR&#xff09;于 2020 年提出的 端到端目标检测算法&#xff0c;它基于 Transformer 架构&#xff0c;消除了 Faster R-CNN、YOLO 等方法中的 候选框&#xff08;…...

C++ Primer 访问控制与封装

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…...

LSTM细胞状态门控设计详解:数学原理、代码实现与工业级优化方案

一、数学原理深度解析 1.1 细胞状态更新方程 LSTM通过三个门控机制精确控制细胞状态&#xff1a; 遗忘门&#xff1a;f_t σ(W_f[h_{t-1}, x_t] b_f)输入门&#xff1a; i_t σ(W_i[h_{t-1}, x_t] b_i) C̃_t tanh(W_C[h_{t-1}, x_t] b_C)状态更新&#xff1a;C_t f_…...

hive(hdfs)补数脚本

pb级别迁移通常要持续1个月以上。一般的过程是&#xff0c;全量迁移&#xff0c;追平数据&#xff0c;增量同步&#xff0c;校验&#xff0c;补数。 这里的指定补数脚本&#xff1a; 输入需要补数的表&#xff0c;如Input.txt&#xff0c;如果有分区则加补此分区&#xff0c;没…...

Python学习心得函数

一、函数的定义及调用 1.函数的定义&#xff1a; 函数的定义&#xff1a;函数是将一段能实现某种特定功能的代码&#xff0c;使用函数名进行封装&#xff0c;并通过函数名称进行调用。从而达到一次编写&#xff0c;多次调用的目的。 2.函数类型分为两类&#xff1a; &#…...

RabbitMQ服务异步通信

消息队列在使用过程中&#xff0c;面临着很多实际问题需要思考&#xff1a; 1. 消息可靠性 消息从发送&#xff0c;到消费者接收&#xff0c;会经理多个过程&#xff1a; 其中的每一步都可能导致消息丢失&#xff0c;常见的丢失原因包括&#xff1a; 发送时丢失&#xff1a; 生…...

适用于 Windows 仅 0.6MB 且免费无广告的绿色截图工具

软件介绍 YasoCut 可是一款源自 GitHub 的宝藏截图软件&#xff0c;专为 Windows 系统打造&#xff0c;亮点十足。它体积超小&#xff0c;仅有 0.6MB&#xff0c;并且简单易用、免费无广告&#xff0c;还贴心地提供了绿色版本。 这款软件的独特之处在于&#xff0c;和常见截图…...

three.js+WebGL踩坑经验合集(8.2):z-fighting叠面问题和camera.near的坑爹关系

本篇延续上篇内容&#xff1a; three.jsWebGL踩坑经验合集(8.1):用于解决z-fighting叠面问题的polygonOffset远没我们想象中那么简单-CSDN博客 笔者在上篇提到&#xff0c;叠面的效果除了受polygonOffset影响以外&#xff0c;还跟相机的近裁剪面camera.near密切相关&#xff…...

[LeetCode力扣hot100]-链表

相交链表 160. 相交链表 - 力扣&#xff08;LeetCode&#xff09; 思路就是遍历两个链表&#xff0c;有相同的部分就可以视为相交。 但是长度不一样&#xff0c;比如两个会相交的链表&#xff0c;headA 的长度为 a c&#xff0c;headB 的长度为 b c&#xff0c;其中 c 是公…...

Deepseek官方整理的13类提示词推荐

最近 deepseek 实在是太火了&#xff0c;网上出现了各种大神教你怎么用好它的免费教程&#xff0c;当然也还有各种需要付费才教你怎么用提示词的课程。但我觉得对于使用 AI 来说&#xff0c;根本就不需要教&#xff0c;关键是要理解一条和 AI 沟通的核心原则&#xff1a;和人交…...

hystrix超详细教学

1、什么是hystrix&#xff1f; 是一个做熔断的框架&#xff0c;当程序被高并发访问时可能会造成微服务的宕机&#xff0c;hystrix可以熔断微服务之间通信。防止后台服务发生雪崩。 2、Hystrix作用 熔断查看微服务请求状态 3、Hystrix使用场景 是在微服务架构下才有意义&am…...

Linux的基础指令和环境部署,项目部署实战(下)

目录 上一篇&#xff1a;Linxu的基础指令和环境部署&#xff0c;项目部署实战&#xff08;上&#xff09;-CSDN博客 1. 搭建Java部署环境 1.1 apt apt常用命令 列出所有的软件包 更新软件包数据库 安装软件包 移除软件包 1.2 JDK 1.2.1. 更新 1.2.2. 安装openjdk&am…...

250217-数据结构

1. 定义 数据结构是数据的存储结构&#xff0c;即数据是按某些结构来存储的&#xff0c;比如线性结构&#xff0c;比如树状结构等。 2. 学习意义 数据结构是服务于算法的&#xff0c;为了实现算法的高效计算&#xff0c;所以将数据按特定结构存储。比如使用快速插入或删除的…...