1. 程式人生 > >面向物件【day07】:新式類和經典類(八)

面向物件【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中的深度查詢了