Python3学习之路~6.7 经典类和新式类的继承顺序
在Python中,经典类(class Person:)和新式类(class Person(object):)的主要区别就是体现在多继承的顺序上。
Python 2.x中默认都是经典类,只有显式继承了object才是新式类;
Python 3.x中默认都是新式类,不必显式地继承object。
假设现在有一个D类继承了B类和C类,B类和C类又分别继承了A类。
在Python2.7中分别执行如下经典类代码:
# Author:Zheng Na
# encoding=utf-8
#当D类中有构造函数时,实例化时会执行D类的构造函数
class A:
def __init__(self):
print("A") class B(A):
def __init__(self):
print("B") class C(A):
def __init__(self):
print("C") class D(B,C):
def __init__(self):
print("D") d = D() #输出:D
当D类中有构造函数时,实例化时会执行D类的构造函数
# Author:Zheng Na
# encoding=utf-8
#当D类中没有构造函数时,实例化时会执行B类的构造函数
class A:
def __init__(self):
print("A") class B(A):
def __init__(self):
print("B") class C(A):
def __init__(self):
print("C") class D(B,C):
pass d = D() #输出:B
当D类中没有构造函数时,实例化时会执行B类的构造函数
# Author:Zheng Na
# encoding=utf-8
#当D类、B类中没有构造函数时,实例化时会执行A类的构造函数
class A:
def __init__(self):
print("A") class B(A):
pass class C(A):
def __init__(self):
print("C") class D(B,C):
pass d = D() #输出:A
当D类、B类中没有构造函数时,实例化时会执行A类的构造函数
# Author:Zheng Na
# encoding=utf-8
#当D类、B类、A类中没有构造函数时,实例化时会执行C类的构造函数
class A:
pass class B(A):
pass class C(A):
def __init__(self):
print("C") class D(B,C):
pass d = D() #输出:C
当D类、B类、A类中没有构造函数时,实例化时会执行C类的构造函数
你会发现,Python2.7中经典类的继承顺序是深度优先策略,先一级一级的往上查找,查到根部没有的话,再返回下一级查找。
在Python2.7中分别执行如下新式类代码:
# Author:Zheng Na
# encoding=utf-8
# 当D类中有构造函数时,实例化时会执行D类的构造函数
class A(object):
def __init__(self):
print("A") class B(A):
def __init__(self):
print("B") class C(A):
def __init__(self):
print("C") class D(B, C):
def __init__(self):
print("D") d = D() # 输出:D
当D类中有构造函数时,实例化时会执行D类的构造函数
# Author:Zheng Na
# encoding=utf-8
# 当D类中没有构造函数时,实例化时会执行B类的构造函数
class A(object):
def __init__(self):
print("A") class B(A):
def __init__(self):
print("B") class C(A):
def __init__(self):
print("C") class D(B, C):
pass d = D() # 输出:B
当D类中没有构造函数时,实例化时会执行B类的构造函数
# Author:Zheng Na
# encoding=utf-8
# 当D类、B类中没有构造函数时,实例化时会执行C类的构造函数
class A(object):
def __init__(self):
print("A") class B(A):
pass class C(A):
def __init__(self):
print("C") class D(B, C):
pass d = D() # 输出:C
当D类、B类中没有构造函数时,实例化时会执行C类的构造函数
# Author:Zheng Na
# encoding=utf-8
# 当D类、B类、C类中没有构造函数时,实例化时会执行A类的构造函数
class A(object):
def __init__(self):
print("A") class B(A):
pass class C(A):
pass class D(B, C):
pass d = D() # 输出:A
当D类、B类、C类中没有构造函数时,实例化时会执行A类的构造函数
你会发现,Python2.7中新式类的继承顺序是广度优先策略,先在上一级从左到右查找一遍,没有的话,再到上上一级从左到右查找一遍,以此类推。

| 经典类 | 新式类 | |
| Python2.x | 深度优先 | 广度优先 |
| Python3.x | 广度优先 | 广度优先 |
Python2.x的经典类是按照深度优先策略来继承的,新式类是按照广度优先策略来继承的。
Python3.x的经典类和新式类统一都是按照广度优先策略来继承的。
这并不是Python 2.x中的一个bug,只能算是一种策略。由于在大多数情况下,深度优先的效率没有广度优先高,所以在Python 3.x中才全部改为了广度优先。
另外,super()也是新式类的用法。
附:官方文档 https://www.python.org/doc/newstyle/
Python3学习之路~6.7 经典类和新式类的继承顺序的更多相关文章
- Python3学习之路~0 目录
目录 Python3学习之路~2.1 列表.元组操作 Python3学习之路~2.2 简单的购物车程序 Python3学习之路~2.3 字符串操作 Python3学习之路~2.4 字典操作 Pytho ...
- python学习笔记(二十六)经典类和新式类的区别
首先了解一下什么是经典类,什么是新式类 class Person: #经典类 pass class Person2(object): #新式类 pass #类名首字母都大写 #在python3里面经典 ...
- python中经典类和新式类的区别
要知道经典类和新式类的区别,首先要掌握类的继承.类的继承的一个优点就是减少代码,而且使代码看起来结构很完整. 那什么是经典类,什么是新式类呢? 经典类和新式类的主要区别就是类的继承的方式 ,经典类遵循 ...
- python------面向对象介绍之经典类与新式类的继承顺序
一. 经典类与新式类的继承顺序 1 class A: def __init__(self): print("A") class B(A): def __init__(self): ...
- Python【经典类与新式类】
经典类多继承的调用方法顺序是:深度优先查询,如下图: 新式类多继承的调用方法顺序是:广度优先查询,如下图: 可以使用下面的代码进行实验验证: #经典类class A: def __init__ ...
- python基础--类的经典类vs新式类
经典类VS新式类区别 1)写法新式类class Person(object):#new style 经典类class Persion: #classical style 2)调用父类 新式写法用sup ...
- 【python】-- 类的多继承、经典类、新式类
继承知识点补充 在python还支持多继承,但是一般我们很少用,有些语言干脆就不支持多继承,有多继承,就会带来两个概念,经典类和新式类. 一.多继承 之前我们都是讲的单继承,那么什么是多继承呢?说白了 ...
- python 之 面向对象基础(继承与派生,经典类与新式类)
7.2 继承与派生 7.21继承 1.什么是继承? 继承是一种新建类的的方式,在python中支持一个子类继承多个父类.新建的类称为子类或者派生类,父类又可以称为基类或者超类,子类会”遗传“父类的属性 ...
- Python 经典类和新式类
#!/usr/bin/env python# -*- coding:utf-8 -*-# 作者:Presley# 邮箱:1209989516@qq.com# 时间:2018-10-21# 新式类和经典 ...
随机推荐
- Linux权限详解 命令之 chmod:修改权限
权限简介 Linux系统上对文件的权限有着严格的控制,用于如果相对某个文件执行某种操作,必须具有对应的权限方可执行成功. Linux下文件的权限类型一般包括读,写,执行.对应字母为 r.w.x. Li ...
- web.xml配置DispatcherServlet (***-servlert.xml)
1. org.springframework.web.servlet.DispatcherServlet 所在jar包: <dependency> <groupId>org.s ...
- Solve Error : Undefined function or variable ‘setInitialWorkingFolder’. Error in matlabrc (line 197)
When compile program using Visual Studio 2015, Matlab 2016b, and OpenCV 3.1.0, one might get the err ...
- 正则表达式、re模块
正则表达式 一说规则我已经知道你很晕了,现在就让我们先来看一些实际的应用.在线测试工具 http://tool.chinaz.com/regex/ 正则表达式是用来匹配字符串非常强大的工具,在其他编程 ...
- [No000015B]三十分钟说清经济机器是怎样运行的
https://v.qq.com/x/page/z01685nf12f.html
- 机器学习入门之使用numpy和matplotlib绘制图形
机器学习当中能深入浅出的方法第一步就是先学会用numpy了.numpy是一个第三方的开源python库,他提供了许多科学的数值计算工具,尤其是大型矩阵计算,但使用配置非常简单,结合matplotlib ...
- Hibernate的配置文件,hibernate.cfg.xml
单纯的只针对持久层框架 Hibernate 配置文件的一些总结 一.Hibernate底层原理 1. Hibernate保存原理 目的:把domain对象保存到数据库的表,形成一条记录. sql: i ...
- 超级有用的15个mysqlbinlog命令
在MySQL或MariaDB中,任意时间对数据库所做的修改,都会被记录到日志文件中.例如,当你添加了一个新的表,或者更新了一条数据,这些事件都会被存储到二进制日志文件中.二进制日志文件在MySQL主从 ...
- COMSOL
COMSOL_百度百科 https://baike.baidu.com/item/COMSOL/10943148?fr=aladdin 显著特点 ■ 求解多场问题 = 求解方程组,用户只需选择或者自定 ...
- post/get in console of JSarray/js 数组详细操作方法及解析合集
https://juejin.im/post/5b0903b26fb9a07a9d70c7e0[ js 数组详细操作方法及解析合集 js array and for each https://blog ...