面向对象【day07】:新式类和经典类(八)

本节内容

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中的深度查询了

猜你喜欢

转载自www.cnblogs.com/luoahong/p/9895376.html