在学习到深度和广度的时候,懵了很久.后来看到这篇文章,恍然大悟.写的很好.特意转过来.

经典类: 只要有父类, 就会沿着一直找, 即使已经找过了~

新式类: 在类继承的多个类拥有共同父类的情况下, 会优先横向查找, 直到剩下最后一个继承自这个共同父类的对象, 再向上查找.

如果类仅继承一个父类的情况下,会继续向上查找.

新式类和经典类对方法查找方式有区别. 我们称之为广度优先和深度优先.

但很多人会误会这句话的意思.

我们来看一个例子:

大家可能会理解为这种查找方式, 但是实际上, 不是的, 如果方法没找到的情况下, 且只有一个条继承的路线, 那么就会沿着这条路线继续向上找. 说的有点晕乎, 我们看例子:

这里我们可以这么理解, E 继承自B, C, D 而B, C, D又同时继承自A, 所以查找的思路是这样的.

  • E 首先找到B, 发现B 与C, D共享A, 就不再向上找, 横向查找.
  • E 于是找到了C, 发现 C 与 D共享A, 于是也不再向上找, 又开始横向查找
  • E 再找到了D, 此时只有D这么最后一根线连着A了, 便开始沿着D的继承关系, 找到了A

如果到这里, 你已经明白了, 可以尝试着看看这题:

下面是这道题的答案, 在分析一下

  1. A先找到B, B继承自E且只有B继承自E, 所以找E , 同理发现E继承且只有E继承自H , 于是找H , 再找到J
  2. 再开始找C ,发现C继承且仅有C继承自F, 于是开始找F, 开始找F, 发现F与I共同继承自K, 于是放弃向上找
  3. 开始找D, D上与之前类似, 都是继承且仅仅只有一个继承关系, 一直到I, 发现除去刚刚找过的F之外, 已经没有其他类继承自K了, 于是I就向上走, 找到K

再来试试

答案:

如果到这里, 你都对了, 那么新式类的方法查找路径你就理解了.

现在再来说说经典类. 就是一句话, 只要有爹就一路向上走.

我们按照经典类的方法查找路径去写写刚刚这道题.

这里给出答案 A B C E F G D E F G.

总结一下方法查找的区别:

经典类: 只要有父类, 就会沿着一直找, 即使已经找过了~

新式类: 在类继承的多个类拥有共同父类的情况下, 会优先横向查找, 直到剩下最后一个继承自这个共同父类的对象, 再向上查找.

作者:咸鱼永动机
链接:https://www.jianshu.com/p/a1966ac2c39b
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

<转>Python中的新式/经典类的查找方式的更多相关文章

  1. 非常易于理解‘类'与'对象’ 间 属性 引用关系,暨《Python 中的引用和类属性的初步理解》读后感

    关键字:名称,名称空间,引用,指针,指针类型的指针(即指向指针的指针) 我读完后的理解总结: 1. 我们知道,python中的变量的赋值操作,变量其实就是一个名称name,赋值就是将name引用到一个 ...

  2. python中如何统计一个类的实例化对象

    类中的静态变量 需要通过类名.静态变量名 来修改 :通过对象不能修改 python中如何统计一个类的实例化对象?? class Person: #静态变量count,用于记录类被实例化的次数 coun ...

  3. 22.python中的面向对象和类的基本语法

    当我发现要写python的面向对象的时候,我是踌躇满面,坐立不安呀.我一直在想:这个坑应该怎么爬?因为python中关于面向对象的内容很多,如果要讲透,最好是用面向对象的思想重新学一遍前面的内容.这个 ...

  4. Python 中的函数与类的方法

    注:本文转译自 Stackoverflow 上 Adding a Method to an Existing Object 的最佳回答. 在 python 中,def 定义的函数与类中的方法有很大的不 ...

  5. Python 中的引用和类属性的初步理解

    最近对Python 的对象引用机制稍微研究了一下,留下笔记,以供查阅. 首先有一点是明确的:「Python 中一切皆对象」. 那么,这到底意味着什么呢? 如下代码: #!/usr/bin/env py ...

  6. Python中的__name__和类

    1.   python中if __name__ == '__main__': 的解析 经常会在代码的最下面看到if __name__ == '__main__':,现在就来介 绍一下它的作用. 模块是 ...

  7. 关于如何在Python中使用静态、类或抽象方法的权威指南

    Python中方法的工作方式 方法是存储在类属性中的函数,你可以用下面这种方式声明和访问一个函数 >>> class Pizza(object): ... def __init__( ...

  8. python学习之【第十七篇】:Python中的面向对象(类和对象)

    1.什么是类和类的对象? 类是一种数据结构,我们可以用它来定义对象,后者把数据值和行为特性融合在一起,类是现实世界的抽象的实体以编程形式出现.实例是这些对象的具体化.类是用来描述一类事物,类的对象指的 ...

  9. 在Python中创建和使用类

    编程只是 if : 为了少写重复的代码,有了循环 for/while: 但碰到很长的重复代码,可能用一个循环难以实现,所以出现了面向对象的思想: 类:就是你的循环主体 实例:就是对你的循环的一次调用 ...

随机推荐

  1. 关于this的理解

    var o = { a:10, b:{ a:12, fn:function(){ console.log(this.a); //undefined console.log(this); //windo ...

  2. JS页面打印

    平常浏览网页和文档的时候,随处可见打印两个字,有时候不小心点到或者快捷键触发到,就会弹出一个打印的页面,上边显示的打印机是GoldGrid Virtual Printer,这是计算机的虚拟打印机,打印 ...

  3. E. Magic Stones CF 思维题

    E. Magic Stones time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  4. C#多线程の遇见长耗时操作以及多任务(简明记要)

    4.0用         Task.Factory.StartNew(()=>{});4.0以下用  ThreadPool.QueueUserWorkItem(()=>{})4.0以上用 ...

  5. linux学习笔记整理(七)

    第八章 Centos7软件包的管理与安装本节所讲内容:8.1 使用rpm命令-安装-查看-卸载-rpm软件包8.2 yum管理软件包8.3 实战tar源码包管理-srpm源码包安装方法 8.1 软件包 ...

  6. Java锁的种类以及辨析(二):自旋锁的其他种类

    作者:山鸡 锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) .这些已经写好提供的锁为我们开发提供了便利,但是锁的具 ...

  7. 转://Oracle 单引号转义

    在ORACLE中,单引号有两个作用: 1:字符串是由单引号引用 2:转义. 单引号的使用是就近配对,即就近原则.而在单引号充当转义角色时相对不好理解 1.从第二个单引号开始被视为转义符,如果第二个单引 ...

  8. .NET中使用Redis 转发

    .NET中使用Redis   Redis是一个用的比较广泛的Key/Value的内存数据库,新浪微博.Github.StackOverflow 等大型应用中都用其作为缓存,Redis的官网为http: ...

  9. Spring Security(二十二):6.4 Method Security

    From version 2.0 onwards Spring Security has improved support substantially for adding security to y ...

  10. 后端list集合中的数据传递到前台HTML中显示(表格形式)

    关键字:web项目中前后台数据传递问题 在学习web项目的过程中,我们肯定会遇到前后台数据交换问题.这个问题我也思考了很久,今天借此总结一下.由于博主水平有限,如有不当之处,还请大家多多指正,,废话不 ...