MRO在面向对象编程中是很重要的思想,也是很多新手难以理解的牛角尖,下面谈谈我的理解,希望抛砖引玉.

场景:
面试题:什么是MRO
答:MRO是单词的简写,是指方法解析顺序

那你怎么理解MRO?
答:MRO主要是指在支持继承编程语言中方法解析的顺序,是靠算法(函数)计算出来的,是人为规定的,就是一种规则.

那就python来说的MRO顺序是怎样的?
答:你是说py2还是py3?他们中的MRO顺序是不一样的哦?

都说一说.
答:我一般都用py3,所以py2简单说一下(幸好他不问py2,哈哈…)

ok开始:
假定大家都是知道什么是继承,在编程语言中,继承是有顺序的,因为代码是一行一行执行的,如果是单继承,没问题,但是多继承就有可能混乱,比方说我继承了a,又继承了b,a和b中都有同名的方法,我调用方法时候,是调用a的还是b的,就规定了一种顺序.
其实严格上来说py2和py3不足以划分MRO的分界,这个顺序严格上是以PY2.3为分界的(),在py2.3以前,经典类没有本源,遵循的是深度解析的原则,就是不管继承关系有多混乱,解释器会找到你最先继承的谁的.但是这是不合理的,人类的进化是以知识的迭代为基础的,如果新的知识优于旧的知识(别跟我杠什么是新什么是旧,什么优什么不优),那我们就应该接受新的知识,也就是说为什么要继承,其目的是为了达到最先进的选择从而节省更新成本,所以从py2.3开始,规定了所有类的本源必须是object引入了新的C3(类似于拓扑)算法实现新的MRO,他的原则是局部优先.也就是说继承离你上一代亲人的方法.
代码:

这个算法实现的原理是,将class后面的括号()里的类顺序,按照从本身开始,从左到右的顺序进行单独遍历,如果他们有中有很混乱的继承,就按遍历的结果取出第一个拿到的类,以此类推,直道最终的object类,
算法如图:

代码如图:

需要注意的是,py3的MRO规定中,你不能写出二义性的类,会报错.
代码检测如图:

所以,MRO简单来说就被规定成了按照书写顺序从左到右继承了.写代码的时候就要按照规范,从self开始,写到最后的object.

面试官:
那py3中既然规定了调用顺序,怎么实现更老父类的方法的调用?
答:super啊!!(当然还能直接类名调用)
总结:
1,MRO保证了多继承情况 每个类只出现一次
2,super().__init__相对于类名.init,在单继承上用法基本无差
3,但在多继承上有区别,super方法能保证每个父类的方法只会执行一次,而使用类名的方法会导致方法被执行多次
4,多继承时,使用super方法,对父类的传参数,应该是由于python中super的算法导致的原因,必须把参数全部传递,否则会报错
5,单继承时,使用super方法,则不能全部传递,只能传父类方法所需的参数,否则会报错
6,多继承时,相对于使用类名.__init__方法,要把每个父类全部写一遍, 而使用super方法,只需写一句话便执行了全部父类的方法,这也是为何多继承需要全部传参的一个原因

下面是一个小练习:

class Parent(object):x = 1class Child1(Parent):passclass Child2(Parent):passprint(Parent.x, Child1.x, Child2.x)
Child1.x = 2
print(Parent.x, Child1.x, Child2.x)
Parent.x = 3
print(Parent.x, Child1.x, Child2.x)

答案:

1 1 1
1 2 1
3 2 3

这里比较容易混的就是,继承----调用----重写 的含义,总结起来 继承是为了调用,但是重写了,就不继承了 !!!

(抛砖引玉,不喜请忽略)

个人公众号,没事看看可以(关于父子故事的)

面试:MRO问题 (理解笔记)相关推荐

  1. Java开发面试高频考点学习笔记(每日更新)

    Java开发面试高频考点学习笔记(每日更新) 1.深拷贝和浅拷贝 2.接口和抽象类的区别 3.java的内存是怎么分配的 4.java中的泛型是什么?类型擦除是什么? 5.Java中的反射是什么 6. ...

  2. 嵌入式面试(笔试)笔记1

    嵌入式面试(笔试)笔记1 本文是对于下面链接的B站系列视频的学习笔记 语言笔试题,C++笔试题,嵌入式笔试题,面试题,难点疑点解析(持续更新) 在另外一篇文章的基础上增加或者强调一些对自己更重点的知识 ...

  3. 嵌入式面试(笔试)笔记2

    嵌入式面试(笔试)笔记2 本文是对于下面链接的B站系列视频的学习笔记 语言笔试题,C++笔试题,嵌入式笔试题,面试题,难点疑点解析(持续更新) 在另外一篇文章的基础上增加或者强调一些对自己更重点的知识 ...

  4. Missing Tag Identification in COTS RFID Systems: Bridging the Gap between Theory and Practice 理解+笔记

    Missing Tag Identification in COTS RFID Systems: Bridging the Gap between Theory and Practice 理解+笔记+ ...

  5. MIT四足机器人Cheetah 3控制方案理解笔记(2)——Convex Mpc身体姿态控制

    在"MIT四足机器人Cheetah 3控制方案理解笔记(1)"中,主要简单的总结了下一般情况下腿足机器人的摆动腿控制方法以及Cheetah 3的基于集中质量模型的平衡控制器.此外, ...

  6. Fast and Accurate Detection of Unknown Tags for RFID Systems – Hash Collisions are Desirable 理解+笔记

    Fast and Accurate Detection of Unknown Tags for RFID Systems – Hash Collisions are Desirable 理解+笔记+翻 ...

  7. Attention机制理解笔记(空间注意力+通道注意力+CBAM+BAM)

    Attention机制理解笔记 声明 Attention分类(主要SA和CA) spitial attention channel attention SA + CA(spitial attentio ...

  8. android 三方_面试官送你一份Android热门三方库源码面试宝典及学习笔记

    前言 众所周知,优秀源码的阅读与理解是最能提升自身功力的途径,如果想要成为一名优秀的Android工程师,那么Android中优秀三方库源码的分析和理解则是必备技能.就拿比较热门的图片加载框架Glid ...

  9. 金九银十北漂记第2篇:《Java程序员面试宝典》读书笔记

    尽信书,则不如无书.-–孟子 谈一谈这本书  <Java程序员面试宝典>是我接触的第一本讲解面试相关的书籍在看到这本书之前我就经常逛csdn的bbs,已经接触面试之类的知识.不过这本书还是 ...

  10. 备战金九银十,阿里P8师兄指导完整攻略(附:学习资料+面试宝典+项目实战笔记)

    前言 还剩下两个月就到了金九银十,一般来说,秋招的含金量明显是高于春招的. 那么如何准备即将到来的面试热潮呢?运筹帷幄之后,决胜千里之外! 坚决不打毫无准备的仗是小编的原则:不论是笔试还是面试都是有章 ...

最新文章

  1. Mybatis简单的入门之增删改查
  2. RT-thread内核之空闲线程
  3. 虚拟化:企业信息化建设中坚力量
  4. Java培训分享5个常用Java代码混淆器
  5. 用Matlab与c++程序生成的数据文件绘制sin函数
  6. 焦旭超 201771010109《面向对象程序设计课程学习进度条》
  7. python逻辑运算符不懂_Python之逻辑运算符
  8. 前端基础-html-换行标签
  9. 免费送书的网站-每人限一本
  10. Java多线程实现多客户端的通信
  11. 如何安装和配置 AngularJS Eclipse
  12. 对于NAS,IP SAN以及iSCSCI SAN存储的一些认识和理解
  13. 凤凰刷机软件连接不上手机的解决办…
  14. batchplot插件用法_最好用的CAD批量打印机SmartBatchPlot使用指南
  15. 天刀手游不显示服务器列表,天涯明月刀手游服务器bug解决方法
  16. 菜鸟也能学cocos2dx3.0 浅析刀塔传奇(下)
  17. a标签,相对地址,绝对地址,锚点技术
  18. 【UE4从零开始 007】Tick简介
  19. 北京丰台线下处理交通违章的地方在哪里
  20. java勇者大冒险_文字冒险页面游戏-java用到了类,循环等

热门文章

  1. Racket编程指南——17 创造语言
  2. 如何正确选择气体在线过程分析系统?(下)
  3. 导数定义考法一网打尽
  4. 程序员如何转职区块链开发
  5. 单链表创建以及头插、尾插(一)-(B站)史上最强最细腻的linux嵌入式C语言学习教程【李慧芹老师】
  6. 量化投资学习——介绍orderflow
  7. 触摸屏设置禁用手指缩放机双击放大功能
  8. php怎么将农历转换成公历,php 公历农历如何实现转换
  9. 【Python入门】Turtle海龟库:利用海龟画笔绘制正方形和圆形
  10. 微信公众号涨粉攻略大全及实战