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