Python 中的方法解析顺序(MRO)

news2024/11/16 2:28:37

在 Python 中,MRO(Method Resolution Order,方法解析顺序)是指类继承体系中,Python 如何确定在调用方法时的解析顺序。MRO 决定了在多继承环境下,Python 如何寻找方法或属性,即它会根据一定规则从父类中查找方法或属性,避免重复继承带来的歧义。

1. MRO 介绍

在 Python 中,类可通过多继承(即从多个父类继承)来获得不同父类的功能。为了避免由于多继承带来的冲突和不确定性,Python 使用了 MRO 来确定方法调用的顺序。

从 Python 2.3 [1]开始,Python 使用 C3 线性化算法 来决定类的 MRO。Python 的继承系统遵循该算法,这使得继承路径清晰且无二义性。

2. MRO 计算步骤

(1)MRO 计算步骤

  • 从当前类开始,将当前类添加到 MRO 列表的末尾。
  • 遍历当前类的基类列表。
  • 对于每个基类,如果它还没有被添加到 MRO 列表中,将其添加到 MRO 列表的末尾,并递归地重复步骤 2。
  • 如果基类列表为空,则结束。

(2)查看类的 MRO

在 Python 中,可通过 __mro__ 属性或内置的 mro() 方法来查看类的 MRO。如下所示:

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

class B(A):
    def foo(self):
        print("B")

class C(A):
    def foo(self):
        print("C")

class D(B, C):
    pass

# 查看类 D 的 MRO
print(D.__mro__)
# 或者
print(D.mro())

输出结果显示 D 类的 MRO 顺序:

(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)

这个 MRO 表示 Python 将首先在 D 类中查找方法,如果没有找到,再去 B 类,然后是 C 类,接着是 A 类,最后是 object 类。

3. C3 线性化算法

(1)算法特性

  • 单调性:MRO 列表在继承过程中是单调的,这意味着一旦一个类被添加到 MRO 中,它就不会再被添加到后面的类中。
  • 非循环性:MRO 列表不会包含任何循环。
  • 保持子类顺序:如果一个类 B 继承自类 A 和类 C,那么 A 应该在 C 之前出现在 MRO 中。

(2)简单示例

假设有以下类继承关系,如下所示:

class A:
    pass

class B(A):
    pass

class C(A):
    pass

class D(B, C):
    pass

MRO 计算过程,如下所示:

  • D 类的直接父类是 B 和 C,因此 MRO 将从这两个类开始。为了保证类 B 在类 C 之前解析(因为 B 在 D 类的声明中出现在前面),MRO 按顺序选择 B 和 C。
  • 然后,MRO 会解析 B 和 C 各自的父类 A,确保 A 只出现一次,且在 B 和 C 之后。
  • 最后,所有类都继承自 object 类。

这样最终 MRO 为 [D, B, C, A, object]

4. super() 函数与 MRO

在多继承中,super() 函数使用 MRO 来决定调用顺序。super() 会沿着 MRO 顺序依次调用下一个类的方法。如下所示:

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

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

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

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

d = D()
d.foo()

这里 super() 将沿着 D 类的 MRO 顺序调用 foo() 方法。输出结果为:

A
C
B
D

这表明 Python 沿着 MRO 的顺序依次调用了 A -> C -> B -> D。简单理解,foo() 方法执行顺序与 D 类的 MRO 顺序相反。

5. MRO 解决的问题

(1)避免菱形继承问题

在多重继承中,如果不同的父类继承自同一个祖先类,MRO 确保这个祖先类的方法只会调用一次。

(2)保证方法查找的有序性

MRO 保证了在多继承中有明确的解析顺序,不会出现不确定性或冲突。

MRO 是 Python 中一个复杂但重要的概念,它通过 C3 线性化算法计算出一个类的所有基类的有序列表,这个列表决定了方法或属性在多重继承中的查找顺序。理解 MRO 有助于编写更清晰、更健壮的 Python 代码。

参考文献

[1] The Python 2.3 Method Resolution Order:https://www.python.org/download/releases/2.3/mro/

[2] Make MRO topological sorted:https://discuss.python.org/t/make-mro-topological-sorted/32300

NLP工程化(星球号)

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

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

相关文章

Ceph 基本架构(一)

Ceph架构图 Ceph整体组成 Ceph 是一个开源的分布式存储系统&#xff0c;设计用于提供优秀的性能、可靠性和可扩展性。Ceph 的架构主要由几个核心组件构成&#xff0c;每个组件都有特定的功能&#xff0c;共同协作以实现高可用性和数据的一致性。 以下是 Ceph 的整体架构及其…

【PyTorch】autograd与逻辑回归

autograd – 自动求导系统 torch.autograd autograd torch.autograd.backward 功能&#xff1a;自动求取梯度 tensor&#xff1a;用于求导的张量&#xff0c;如lossretain_graph&#xff1a;保存计算图create_graph&#xff1a;创建导数计算图&#xff0c;用于高阶求导gra…

mac安装JetBtains全家桶新版本时报错:Cannot start the IDE

mac安装JetBtains全家桶新版本时报错&#xff1a;Cannot start the IDE 前言报错信息解决方法 前言 作者使用的是Mac电脑&#xff0c;最近想要更新JetBrains相关工具的软件版本&#xff0c;但是在安装时突然报错&#xff0c;导致安装失败&#xff0c;现在将报错信息以及解决方…

API应用安全风险倍增,F5助企业赢得关键安全挑战

如今&#xff0c;API应用安全的重要性与日俱增&#xff0c;但其复杂性也达到前所未有的程度。F5公司在亚太地区发布全新研究报告《2024策略洞察&#xff1a;亚太地区API安全报告》&#xff08;以下简称为“报告”&#xff09;&#xff0c;指出亚太地区企业正愈加依赖基于人工智…

Linux 进程2

环境变量 再Linux操作系统中一切皆文件&#xff0c;这个环境变量自然也是一个文件&#xff0c;它的作用是辅助我们使用操作系统还可以辨识我们是什么用户(一般用户&#xff0c;root用户)。 env是读取完整环境变量的指令&#xff0c;里面记录了许多我登录操作系统所用的用户的信…

一文说清楚ETL与Kafka如何实现集成

ETL与Kafka为何需要集成? 随着企业对实时流数据的处理要求越来越高&#xff0c;很多企业都把实时流数(日志、实时CDC采集数据、设备数据…)先推入到kafka中&#xff0c;再通过ETL对kafka中的数据进行消费通过ETL强大的数据的转换、清洗功能来进行数据的集成与分发。 实时数据…

table表格,让thead固定,tbody内容滚动,关键是都对齐的纯css写法

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f…

地信、测绘、遥感、地质相关岗位招聘汇总

3s等相关专业25秋招&提前批招聘信息 该岗位信息表&#xff0c;覆盖全国各大省市&#xff0c;招聘岗位主要针对地信、测绘、地质、遥感、城规等专业。 1800WebGIS开发岗位汇总表 该信息表&#xff0c;主要是WebGIS开发岗为主&#xff0c;岗位要求熟悉熟悉Openlayers&#…

【C++篇】~类和对象(中)

类和对象&#xff08;中&#xff09; 1.类的默认成员函数​ 默认成员函数就是用户没有显式实现&#xff0c;编译器会自动生成的成员函数称为默认成员函数。一个类&#xff0c;我们不写的情况下编译器会默认生成以下6个默认成员函数&#xff0c;需要注意的是这6个中最重要的是前…

YOLOv8改进系列,YOLOv8替换主干网络为PP-HGNetV2(百度飞桨视觉团队自研,助力涨点)

摘要 PP-HGNetV2(High Performance GPU Network V2) 是百度飞桨视觉团队自研的 PP-HGNet 的下一代版本,其在 PP-HGNet 的基础上,做了进一步优化和改进,最终在 NVIDIA GPU 设备上,将 “Accuracy-Latency Balance” 做到了极致,精度大幅超过了其他同样推理速度的模型。其在…

远程桌面连接工具Microsoft Remote Desktop Beta for Mac

Microsoft Remote Desktop Beta for Mac 是一款功能强大的远程桌面连接工具&#xff0c;具有以下功能特点&#xff1a; 软件下载地址 跨平台连接&#xff1a; 允许 Mac 用户轻松连接到运行 Windows 操作系统的计算机&#xff0c;打破了操作系统的界限&#xff0c;无论这些 Wi…

什么是HTTP DDOS,如何防护

在当今高度互联的网络世界中&#xff0c;网络安全威胁日益严峻&#xff0c;其中HTTP DDoS&#xff08;Distributed Denial of Service&#xff0c;分布式拒绝服务&#xff09;攻击作为一种常见的网络攻击手段&#xff0c;给企业和个人用户带来了巨大的挑战。今天我们就来详细介…

计算机四级-计算机网络

一、基础知识 1.对计算机网络发展具有重要影响的广域网是&#xff1a;ARPANET 随机争用型的介质访问控制方法起源于&#xff1a;ALOHANET 2.计算机网络发展阶段&#xff1a; A&#xff09;第一阶段的主要成果是计算机技术与通信技术的结合 B&#xff09;第二阶段的主要成果…

ZYNQ FPGA自学笔记~操作PLL

一 时钟缓冲器、管理和路由 垂直时钟中心&#xff08;clock backbone&#xff09;将设备分为相邻的左侧和右侧区域&#xff0c;水平中心线将设备分为顶部和底部两侧。clock backbone中的资源镜像到水平相邻区域的两侧&#xff0c;从而将某些时钟资源扩展到水平相邻区域。BUFG不…

一、RTOS入门

目录 一、裸机与RTOS介绍 1、裸机 2、 RTOS 二、FreeRTOS简介 1、FreeRTOS 特点 2、关于FreeRTOS学习资料 一、裸机与RTOS介绍 1、裸机 简介&#xff1a;裸机又称为前后台系统&#xff0c;前台系统指的中断服务函数&#xff0c;后台系统指的大循环&#xff08;While循环…

基于PHP的新闻管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于phpMySQL的新闻管理系统。…

数据结构—(java)反射,枚举,lambda表达式

文章目录 反射反射的定义&#xff1a;反射相关的类&#xff1a;反射相关的方法&#xff1a;反射示例&#xff1a;获取Class类对象创建指定类的对象反射私有属性&#xff1a;反射私有方法&#xff1a;反射私有的构造方法 枚举枚举的意义枚举类的实现枚举类的使用&#xff1a;Enu…

JVM面试知识点手册

第一部分&#xff1a;JVM 概述 1.1 JVM 简介 Java Virtual Machine&#xff08;JVM&#xff09; 是 Java 语言的核心组件&#xff0c;负责将 Java 程序编译后的字节码&#xff08;bytecode&#xff09;转换为机器指令&#xff0c;并在目标机器上执行。JVM 提供了硬件和操作系…

创客匠人案例故事|闭关 20 天,私域大爆发,高额发售秘诀是什么?

不是你的能力决定了你的命运&#xff0c;而是你的决定改变了你的人生 王龙老师心赏教养法创始人心赏家园家庭“心生态”发起人国家二级心理咨询师 他是一名致力于解决家庭困境的老师&#xff0c;通过心赏转化五步法&#xff0c;帮助身陷家庭困境的父母&#xff0c;解决自我关系…

Linux——k8s认识

计算资源隔离 - 更方便进行高并发架构的维护和升级 - 架构管理的灵活性更高&#xff0c;不再以单个节点的物理资源作为基础 技术&#xff1a; - 硬件辅助虚拟化 - 容器技术 在企业部署方案中&#xff0c;很少以单节点实现虚拟化和容器技术&#xff0c;一般以集群状态来运…