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

Python 的 MRO

Python 3 里,当子类没有定义某个方法时,在调用该方法时会自动去父类里查找并调用,这一机制是基于 Python 的继承和方法解析顺序(MRO, Method Resolution Order)实现

基本原理

Python 类在继承体系中,当调用一个对象的方法时,解释器会按照 MRO 规定的顺序依次查找该方法。MRO 决定了在多重继承场景下,Python 解释器查找方法和属性的顺序。对于单继承,MRO 顺序很简单,先查找子类,若没找到就去父类查找;对于多重继承,Python 3 使用 C3 线性化算法来确定 MRO 顺序。

单继承

class Parent:def print_message(self):print("This is a message from the Parent class.")class Child(Parent):# 子类没有定义 print_message 方法passchild = Child()
child.print_message()  # 调用父类的 print_message 方法

输出结果:
This is a message from the Parent class.

Child 类没有定义 print_message 方法,所以调用 child.print_message() 时,Python 解释器会去 Parent 类中查找该方法并调用。

多继承

class A:def method(self):print("Method from class A")class B(A):passclass C(A):def method(self):print("Method from class C")class D(B, C):passd = D()
d.method()  # 调用 class C 的 method 方法

输出结果:
Method from class C

D 类继承自 B 和 C,而 B 和 C 又继承自 A。
D 类没有定义 method 方法,Python 解释器会按照 MRO 顺序查找
D 类的 MRO 顺序是 [D, B, C, A, object],所以会先找到 C 类的 method 方法并调用

查看 MRO 顺序
可以使用 __mro__ 属性查看类的 MRO 顺序:

print(D.__mro__)

输出结果:

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

总结

Python 3 中,当子类没有定义某个方法时,会依据 MRO 顺序自动去父类或其他基类中查找并调用该方法。

http://www.lryc.cn/news/586800.html

相关文章:

  • [办公及工程版浏览器]_Google Chrome 138.0.7204.101全屏启动插件
  • es里为什么node和shard不是一对一的关系
  • 香港理工大学实验室定时预约
  • 前端框架状态管理对比:Redux、MobX、Vuex 等的优劣与选择
  • 关于 java:11. 项目结构、Maven、Gradle 构建系统
  • 用 Node.js 构建模块化的 CLI 脚手架工具,从 GitHub 下载远程模板
  • Python 学习之路(十)--常见算法实现原理及解析
  • LabVIEW调用外部DLL
  • [CH582M入门第六步]软件IIC驱动AHT10
  • 【数据结构】图 ,拓扑排序 未完
  • Docker(02) Docker-Compose、Dockerfile镜像构建、Portainer
  • 快速生成 Android 的 Splash 的 9 Patch 图片
  • Docker 搭建本地Harbor私有镜像仓库
  • SpringBoot单元测试类拿不到bean报空指针异常
  • 从架构到代码:飞算JavaAI电商订单管理系统技术解构
  • 决策树的相关理论学习
  • FusionOne HCI 23 超融合实施手册(超聚变超融合)
  • 【C++】多线程同步三剑客介绍
  • 代码随想录算法训练营第十七天
  • 【C++】第十五节—一文详解 | 继承
  • JVM 垃圾收集算法全面解析
  • DC-DC变换器最基本拓扑 -Buck电路和Boost电路
  • ROS2---NodeOptions
  • MacOS使用Multipass快速搭建轻量级k3s集群
  • mac上BRPC的CMakeLists.txt优化:解决Protobuf路径问题
  • TensorFlow深度学习实战(24)——变分自编码器详解与实现
  • Vue 3 动态ref问题
  • 封装---统一封装处理页面标题
  • C++模版编程:类模版与继承
  • Qt 3D模块加载复杂模型