本节内容

1、概述

2、类的多继承

3、经典类VS新式类

4、总结

一、概述

 在python还支持多继承,但是一般我们很少用,有些语言干脆就不支持多继承,有多继承,就会带来两个概念,经典类和新式类,下面我就来学学什么是多继承,什么是经典类和新式类?

二、类的多继承

2.1 多继承

说明:之前我们都是讲的单继承,那么什么是多继承呢?说白了,就是:子类可以继承多个父类,就叫多继承

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class SchoolMember(object):  #SchoolMember类
    '''学校成员基类'''
    def tell(self):
        print("the schoolmeber is tell...")
 
class School(object):     #School类
    """学校类"""
    def open_branch(self,addr):
        print("openning a new branch in",addr)
 
class Teacher(SchoolMember,School):   #子类Teacher同时继承了SchoolMember,School两个类
    "讲师类"
    def teaching(self):
        "讲课方法"
        print("Teacher xiaogao is teaching python")
 
t1 = Teacher()
t1.tell()   #拥有父类SchoolMember的tell方法
t1.open_branch("shanghai")  #拥有父类School的open_branch方法

三、经典类VS新式类

3.1、新式类

1、概念

新式类定义时必须继承object类,被定义继承了object类的,就叫做新式类

1
2
class Person(object):  #继承object类
    "新式类"

2、继承构造方法

新式类初始化构造方法用super关键字去继承

1
super(子类,self).__init__(name,age)

3、调用父类中相同方法或者相同属性的顺序

新式类多继承的调用方法是顺序是:广度优先查询,如下图:

代码实验如下:

①全部代码

 class A(object):  #新式类
def __init__(self):
self.n = "A" class B(A):
def __init__(self):
self.n = "B" class C(A):
def __init__(self):
self.n = "C" class D(B,C):
def __init__(self):
self.n = "D" d = D()
print(d.n) #输出
D

没有问题,先找自己的属性,输出D

②注释D类中代码

 class A(object):
def __init__(self):
self.n = "A" class B(A):
def __init__(self):
self.n = "B" class C(A):
def __init__(self):
self.n = "C" class D(B,C):
pass d = D()
print(d.n) #输出
B

③注释B类中的代码

 class A(object):
def __init__(self):
self.n = "A" class B(A):
pass class C(A):
def __init__(self):
self.n = "C" class D(B,C):
pass d = D()
print(d.n) #输出
C

④注释C类中的代码

 class A(object):
def __init__(self):
self.n = "A" class B(A):
pass class C(A):
pass class D(B,C):
pass d = D()
print(d.n) #输出
A

3.2 经典类

1、概念

经典类定义,什么都不继承

1
2
class Person:
    "经典类"

2、继承构造方法

1
父类.__init(self,name,age)

3、调用父类中相同方法或者相同属性的顺序

经典类多继承的调用方法是顺序是:深度优先查询,如下图:

代码实验如下:

①全部代码

class A:#经典类
def __init__(self):
self.n = "A" class B(A):
pass
def __init__(self):
self.n = "B" class C(A):
def __init__(self):
self.n = "C" class D(B,C):
def __init__(self):
self.n = "D" d = D()
print(d.n) #输出
D

②注释D类中代码

class A:
def __init__(self):
self.n = "A" class B(A):
def __init__(self):
self.n = "B" class C(A):
def __init__(self):
self.n = "C" class D(B,C):
pass d = D()
print(d.n) #输出
B

③注释B类中的代码

class A:
def __init__(self):
self.n = "A" class B(A):
pass class C(A):
def __init__(self):
self.n = "C" class D(B,C):
pass d = D()
print(d.n) #输出
A

④注释A类中的代码

class A:
pass class B(A):
pass class C(A):
def __init__(self):
self.n = "C" class D(B,C):
pass d = D()
print(d.n) #输出
C

四、总结

  1. 新式类继承object类,经典类不继承任何类
  2. 新式类用super关键字继承构造方法,经典类用 父类.__init(self)来继承
  3. 新式类:广度优先查询,经典类:深度优先查询(因为新式类讲究的是新,所以要找最近的,最新的;然后经典的讲究古老,所以更远更深的)
  4. 值得注意的是,我们上面是在python2中做的,在python3中不管是经典类还是新式类,都是采用的是广度优先查询,已经废弃2中的深度查询了

面向对象【day07】:新式类和经典类(八)的更多相关文章

  1. Python之面向对象新式类和经典类

    Python之面向对象新式类和经典类 新式类和经典类的继承原理: 在Python3中,就只有新式类一种了. 先看Python3中新式类: 类是有继承顺序的: Python的类是可以继承多个类的,也就是 ...

  2. python之继承、抽象类、新式类和经典类

    一.上节补充1.静态属性静态属性 : 类的属性,所有的对象共享这个变量 如果用对象名去修改类的静态属性:在对象的空间中又创建了一个属性,而不能修改类中属性的值 操作静态属性应该用类名来操作 例1:请你 ...

  3. python中新式类和经典类的区别

    1).python在类中的定义在py2-3版本上是使用的有新式类和经典类两种情况,在新式类和经典类的定义中最主要的区别是在定义类的时候是否出现引用object;如:经典类:Class 类名::而新式类 ...

  4. Python新式类与经典类的区别

    1.新式类与经典类 在Python 2及以前的版本中,由任意内置类型派生出的类(只要一个内置类型位于类树的某个位置),都属于“新式类”,都会获得所有“新式类”的特性:反之,即不由任意内置类型派生出的类 ...

  5. python中的__new__与__init__,新式类和经典类(2.x)

    在python2.x中,从object继承得来的类称为新式类(如class A(object))不从object继承得来的类称为经典类(如class A()) 新式类跟经典类的差别主要是以下几点: 1 ...

  6. Python 新式类与经典类

    新式类,经典类 查询匹配 广度查询 横着对每个类进行查询 深度查询 无视平级类,直接寻找下级类 #python 3.0 #新式类 广度查询 #经典类 广度查询 #python 2.0 #新式类 广度查 ...

  7. python-反射、新式类与经典类搜索的优先级

    preface include: getattr setattr delattr hasattr class webserver(object): def __init__(self,num): se ...

  8. python单例模式控制成只初始化一次,常规型的python单例模式在新式类和经典类中的区别。

    单例模式的写法非常多,但常规型的单例模式就是这样写的,各种代码可能略有差异,但核心就是要搞清楚类属性 实例属性,就很容易写出来,原理完全一模一样. 如下: 源码: class A(object): d ...

  9. 03-python的新式类和经典类区别

    新式类就是  class person(object): 这种形式的, 从py2.2 开始出现的 新式类添加了: __name__ is the attribute's name. __doc__ i ...

随机推荐

  1. mybatis分页 -----PageHelper插件

    对查询结果进行分页 一,使用limit进行分页 1.mybatis 的sql语句: <if test="page !=null and rows !=null"> li ...

  2. JavaScript中给onclick绑定事件后return false遇到的问题

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. MySql连接空闲8小时自动断开引起的问题

    一.问题描述 ​ 最近遇到了一个奇怪的MySql数据库问题,好几次前一天晚上历史数据还正常存储,第二天早上来了看实时数据存储还正常,历史数据不存储了.找了好久也没找到问题.后来仔细想了想,历史数据设置 ...

  4. [转帖]龙芯下一代处理器微结构GS464E细节曝光

    龙芯下一代处理器微结构GS464E细节曝光 [日期:2015-05-26] 来源:Linux公社  作者:Linux [字体:大 中 小] http://www.linuxidc.com/Linux/ ...

  5. poj 3694 Network(割边+lca)

    题目链接:http://poj.org/problem?id=3694 题意:一个无向图中本来有若干条桥,有Q个操作,每次加一条边(u,v),每次操作后输出桥的数目. 分析:通常的做法是:先求出该无向 ...

  6. D3.js v5 Tutorials

    D3.js v5 Tutorials D3.js v5 教程 https://github.com/d3/d3/blob/master/API.md CHANGES https://github.co ...

  7. linux 源的配置更新

    Ubuntu 首先编辑sources.list这个文件 vi /etc/apt/sources.list 把sources.list文件内容替换成如下 deb http://mirrors.aliyu ...

  8. Jenkins之Linux和window配置区别

    一.命令行配置 windows: java -jar .\libs\gen-html-report-1.0-SNAPSHOT.jar .\reports_%BUILD_NUMBER%.html .\t ...

  9. 好消息,Manjaro Linux 18 已正式发布!

    导读 Manjaro Linux 18 已正式发布!Xfce 版本仍然是旗舰,Manjaro 为其提供了优雅且领先的集成体验.这一版本搭载 Xfce 4.13. 这一版本主要专注于在桌面和窗口管理器上 ...

  10. BZOJ4259 残缺的字符串(FFT)

    两个串匹配时相匹配的位置位置差是相同的,那么翻转一个串就变成位置和相同,卷积的形式. 考虑如何使用卷积体现两个位置能否匹配.一个暴力的思路是每次只考虑一种字符,将其在一个串中设为1,并在另一个串中将不 ...