洗礼灵魂,修炼python(43)--巩固篇—经典类/新式类
经典类
1.什么是经典类
就是在使用class关键词时,括号内不添加object类的就叫经典类,前面的博文里是绝对解析过的,所以你应该知道,经典类现在已经仅存在于python2了,因为python3不管你给没给object都会自动继承object类,其采用MRO算法深度优先搜索。Python 2.x中默认都是经典类,只有显式继承了object才是新式类
例:

像这种,如果不给object生成的类只有自己的属性方法,加上一个文档属性__doct__,一个模块方法__module__
2.特性:深度优先
什么叫深度优先,当多重继承时,会按照父类线路优先继承,如果父类不存在,再最后按照其他线路继承,什么意思呢?看个例子吧

C类同时继承了A和B,但是name属性的结果却是A的name属性,那如果C也有name属性呢?

自然,这个是没什么问题的吧?子类继承父类时,如果子类与父类有相同属性,子类的属性会覆盖父类的属性,这个大家都知道吧?
那如果再多一个父类继承呢?

什么情况?分析一下,C类同时继承了A和B,A又继承与P,C的name属性却是P类的name属性值,像这种就是深度优先,这就是经典类的特性,画个图解释下:

C类因为同时继承了A和B,所以就有两条线路走,C—>A—>P和C—>B,但是优先级更高的是以纵向继承的前者,所以会继承P的name属性
不过还要注意一个情况:

它还是优先纵向继承
新式类
1.什么是新式类
就是在使用class关键词创建类时,给定了继承object基类的就叫新式类。其采用C3算法广度优先搜索。Python 3.x中默认都是新式类,经典类被移除,不必显式的继承object。新式类对象可以直接通过__class__属性获取自身类型:type。例:

和前面经典类做对比,很明显的,继承类object类的属性和方法都很多
2.特性:广度优先
什么叫广度优先,当多重继承时,会尽量避免深度继承,深度能浅一点就浅一点,如果实在无法解决,再最后按照父类的深度来继承,什么意思呢?看个例子吧

这么看好像和经典类的继承方式是一样的对吧?不急再加一层父类看看:

不多说,图解:

它的线路是C—>A—>B—>P和C—>A—>P和C—>B—>P,优先级最高的是前者,先横向查找,实在没有再纵向。
同样的,要注意一个情况:

当B类不继承P时,并且和P类都继承object时,在相同属性下不再遵守广度优先规则,而是一路纵向,得到的还是P类的name属性。这个情况很特殊,记住了。
洗礼灵魂,修炼python(43)--巩固篇—经典类/新式类的更多相关文章
- Python 中的经典类新式类
Python 中的经典类新式类 要知道经典类和新式类的区别,首先要掌握类的继承 类的继承的一个优点就是减少代码冗余 广度优先和深度优先,这主要是在多类继承的时候会使用到 经典类和新式类的主要区别就是类 ...
- 继承 派生 super()经典类 新式类
'''1什么是继承? 继承一种新建类的方式,在python中支持一个儿子继承多个爹 新建的类称为子类的或者派生类 父类有可以称为基类或者超类 子类会‘遗传’父类的属性 2 为什么要用继承 减少代码冗余 ...
- python之继承、抽象类、新式类和经典类
一.上节补充1.静态属性静态属性 : 类的属性,所有的对象共享这个变量 如果用对象名去修改类的静态属性:在对象的空间中又创建了一个属性,而不能修改类中属性的值 操作静态属性应该用类名来操作 例1:请你 ...
- 面向对象:继承(经典类&新式类继承原理、属性查找)、派生
继承: 继承是指类与类之间的关系,是一种“什么”是“什么”的关系. 继承的功能之一就是用来解决代码重用问题 继承是一种创建新类的方式,在Python中,新建的类可以继承一个或多个父类,父类又可以称为基 ...
- Python 学习 —— 进阶篇(装饰器、类的特殊方法)
Python基础部分学完之后,在进入其OOP部分前,先理解一下其装饰器这种结构,其功能可类比于Java中的面向切面编程,下面参见具体实例: def log(f): def fn(x): print ' ...
- 【python】-- 类的多继承、经典类、新式类
继承知识点补充 在python还支持多继承,但是一般我们很少用,有些语言干脆就不支持多继承,有多继承,就会带来两个概念,经典类和新式类. 一.多继承 之前我们都是讲的单继承,那么什么是多继承呢?说白了 ...
- 【Python】Python 新式类介绍
本文转载自:kaka_ace's blog 我们使用 Python 开发时, 会遇到 class A 和 class A(object) 的写法, 这在 Python2 里是有概念上和功能上的区别, ...
- 面向对象【day07】:新式类和经典类(八)
本节内容 1.概述 2.类的多继承 3.经典类VS新式类 4.总结 一.概述 在python还支持多继承,但是一般我们很少用,有些语言干脆就不支持多继承,有多继承,就会带来两个概念,经典类和新式类,下 ...
- Python3学习之路~6.7 经典类和新式类的继承顺序
在Python中,经典类(class Person:)和新式类(class Person(object):)的主要区别就是体现在多继承的顺序上. Python 2.x中默认都是经典类,只有显式继承了o ...
随机推荐
- spring boot -thymeleaf-遍历list和map
遍历 list如下 th:each th:each 状态变量 var 遍历map如下(需要双层遍历) controller代码如下
- 2-1 编写HelloWorld
引用外部的vue.js文件
- Xamarin.Android 调用手机拍照功能
最近开发Android遇到了调用本地拍照功能,于是在网上搜了一些方法,加上自己理解的注释,在这儿记录下来省的下次用时候找不到,同事也给正在寻找调用本地拍照功能的小伙伴一些帮助~ 实现思路:首先加载-- ...
- 30 个java编程技巧
1.return 一个空的集合,而不是 null 如果一个程序返回一个没有任何值的集合,请确保一个空集合返回,而不是空元素.这样你就不用去写一大堆 ”if else” 判断null元素. Java 的 ...
- Centos 7 安装 rabbitmq
1.安装erlang rabbitmq 官方下载地址 "http://www.rabbitmq.com/download.html" ,选择"RHEL, CentOS, ...
- Hadoop项目开发笔录
1.概要 我打算分享一下,我开发Hadoop的一些心得,对于即将步入Hadoop行业的童鞋,希望我整理的这些博文对您有帮助,我打算分为以下几部分来描述. 2.步骤 注:点击链接可直接跳到指定位置 Ha ...
- mybatis教程5(延迟加载和缓存)
关联关系 在关系型数据库中,表与表之间很少是独立与其他表没关系的.所以在实际开发过程中我们会碰到很多复杂的关联关系.在此我们来分析下载mybatis中怎么处理这些关系 1对1关系 我们有一张员工表(T ...
- JavaScript防抖节流函数
1.直接上码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <ti ...
- MySQL基准测试(二)--方法
MySQL基准测试(二)--方法 目的: 方法不是越高级越好.而应该善于做减法.至简是一种智慧,首先要做的是收集MySQL的各状态数据.收集到了,不管各个时间段出现的问题,至少你手上有第一时间的状态数 ...
- [转]简单的动态修改RDLC报表页边距和列宽的方法
本文转自:http://star704983.blog.163.com/blog/static/136661264201161604413204/ 1.修改页边距 XmlDocument XMLDoc ...