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

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

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

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

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

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

我们来看一个例子:

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

这里我们可以这么理解, 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. Java学习笔记(四)——好记性不如烂键盘(答答租车)

    根据所学知识,编写一个控制台版的租车系统. 功能: 1. 展示所有可租车辆 2. 选择车型.租车辆 3. 展示租车清单,包含:总金额.总载货量及其车型.总载人量及其车型 代码参考imooc中Java课 ...

  2. tomcat 设置虚拟路径的4种方法

    通常使用方法1或者方法2  方法1 (添加配置文件):推荐使用,不需要重启服务器 在Tomcat根目录下的/conf/Catalina/localhost/ 路径下新建一个filename.xml,并 ...

  3. 好程序员分享Javascript设计模式

    方法一 对象字面量表示法 在对象字面量表示法中,一个对象被描述为一组包含在大括号中,以逗号分隔的 name/value 对.对象内的名称可以是字符串或标识符,后面跟着一个冒号.对象中最后一个 name ...

  4. (四)JavaScript 语句

    JavaScript 语句 JavaScript 语句是发给浏览器的命令. 这些命令的作用是告诉浏览器要做的事情. 下面的 JavaScript 语句向 id="demo" 的 H ...

  5. class文件魔数CAFEBABE的由来

    https://blog.csdn.net/ustcyy91/article/details/78462378 https://blog.csdn.net/renfufei/article/detai ...

  6. P3372 【模板】线段树 1

    题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个 ...

  7. js动态改变css伪类样式

    首先我们来看下页面上需要实现的基本效果,如下图所示: 因此我们可以使用如下js代码来试试看,是否能使用js改变伪类?如下代码所示: $(function() { $('.listnav li').cl ...

  8. maven笔记-将本地jar包打包进可执行jar中

    参考资料:http://www.cnblogs.com/richard-jing/archive/2013/01/27/Maven_localjar.html 使用本地jar <dependen ...

  9. DataHub使用小结(一)——概述

    一.概念 1.什么是DataHub DataHub是流式数据(Streaming Data)的处理平台,提供对流式数据的发布(Publish),订阅(Subscribe)和分发功能, 可以轻松构建基于 ...

  10. Makefile有三个非常有用的变量。分别是$@,$^,$

    原文地址:https://blog.csdn.net/u013774102/article/details/79043559 假设我们有下面这样的一个程序,源代码如下: /* main.c */ #i ...