面向物件【day07】:新式類和經典類(八)
阿新 • • 發佈:2018-11-02
本節內容
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中的深度查詢了