当前位置: 首页 > 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.dtcms.com/a/277589.html

相关文章:

  • JDBC相关知识点
  • 查看ubuntu磁盘占用方法
  • Prometheus Operator:Kubernetes 监控自动化实践
  • 对测试左移的一些总结和思考
  • Python 数据挖掘实战概述
  • python代码块的表示方法
  • 【惟一最接近10位小数的分数】2022-8-15
  • 06.计算两个日期之间的差值
  • 数学与应用数学核心课程有哪些?全文解析!
  • 【Linux庖丁解牛】— 信号量ipc管理!
  • AI(学习笔记第五课) 使用langchain进行AI开发 load documents(web)
  • 【算法】贪心算法:柠檬水找零C++
  • 基础数论学习笔记
  • 西门子博图PID入门组态编程及调试
  • 代码随想录算法训练营第三十三天|62.不同路径 63. 不同路径 II 343. 整数拆分 96.不同的二叉搜索树
  • Docker(02) Docker-Compose、Dockerfile镜像构建、Portainer
  • SLAM中的非线性优化-2D图优化之激光SLAM cartographer前端匹配(十七)
  • 出现SSL连接错误的原因和解决方案
  • git实际工作流程
  • sql:sql在office中的应用有哪些?
  • 【版本控制】Perforce Helix Core (P4V) 完全入门指南(含虚幻引擎实战)
  • Java 大视界 -- Java 大数据在智能安防视频监控系统中的视频摘要快速生成与检索优化(345)
  • STM32-第六节-TIM定时器-2(输出比较)
  • DNS协议解析过程
  • 【OpenGL ES】手撕一个mini版的Android native渲染框架
  • Linux系统移植19:根文件系统的构建
  • ReAct论文解读(1)—什么是ReAct?
  • (懒人救星版)CNN_Kriging_NSGA2_Topsis(多模型融合典范)深度学习+SCI热点模型+多目标+熵权法 全网首例,完全原创,早用早发SCI
  • C语言关键字---枚举
  • LeetCode|Day8|1047. 删除字符串中的所有相邻重复项|Python刷题笔记