1.類的繼承關係和生活中父親、兒子、孫子之間的關係同樣,Python中若A類繼承B類,則A類稱之爲子類,B類稱之爲父類(也稱爲基類)。
2.類的繼承方式分爲:單繼承、多繼承兩種;python
注意:繼承後若是子類裏沒有會像父類找算法
繼承 class Dad: res = 10 def __init__(self,name): self.name = name print(name) class Son: pass class Grandson(Dad): #單繼承 pass d1 = Grandson("alex") #本身的類裏沒有會像父類找 print(Grandson.res) class Grandson(Dad,Son): #多繼承 pass
那麼問題又來了,多繼承呢?ide
一、Python的類能夠繼承多個類,Java和C#中則只能繼承一個類函數
二、Python的類若是繼承了多個類,那麼其尋找方法的方式有兩種,分別是:深度優先和廣度優先spa
經典類和新式類,從字面上能夠看出一個老一個新,新的必然包含了跟多的功能,也是以後推薦的寫法,從寫法上區分的話,若是 當前類或者父類繼承了object類,那麼該類即是新式類,不然即是經典類。3d
class D: def bar(self): print 'D.bar' class C(D): def bar(self): print 'C.bar' class B(D): def bar(self): print 'B.bar' class A(B, C): def bar(self): print 'A.bar' a = A() # 執行bar方法時 # 首先去A類中查找,若是A類中沒有,則繼續去B類中找,若是B類中麼有,則繼續去D類中找,若是D類中麼有,則繼續去C類中找,若是仍是未找到,則報錯 # 因此,查找順序:A --> B --> D --> C # 在上述查找bar方法的過程當中,一旦找到,則尋找過程當即中斷,便不會再繼續找了 a.bar() 經典類多繼承
class D(object): def bar(self): print 'D.bar' class C(D): def bar(self): print 'C.bar' class B(D): def bar(self): print 'B.bar' class A(B, C): def bar(self): print 'A.bar' a = A() # 執行bar方法時 # 首先去A類中查找,若是A類中沒有,則繼續去B類中找,若是B類中麼有,則繼續去C類中找,若是C類中麼有,則繼續去D類中找,若是仍是未找到,則報錯 # 因此,查找順序:A --> B --> C --> D # 在上述查找bar方法的過程當中,一旦找到,則尋找過程當即中斷,便不會再繼續找了 a.bar() 新式類多繼承
class A(object): def test(self): print('from A') class B(A): def test(self): print('from B') class C(A): def test(self): print('from C') class D(B): def test(self): print('from D') class E(C): def test(self): print('from E') class F(D,E): # def test(self): # print('from F') pass f1=F() f1.test() print(F.__mro__) #只有新式纔有這個屬性能夠查看線性列表,經典類沒有這個屬性 #新式類繼承順序:F->D->B->E->C->A #經典類繼承順序:F->D->B->A->E->C #python3中統一都是新式類 #pyhon2中才分新式類與經典類 繼承順序
經典類:首先去A類中查找,若是A類中沒有,則繼續去B類中找,若是B類中麼有,則繼續去D類中找,若是D類中麼有,則繼續去C類中找,若是仍是未找到,則報錯code
新式類:首先去A類中查找,若是A類中沒有,則繼續去B類中找,若是B類中麼有,則繼續去C類中找,若是C類中麼有,則繼續去D類中找,若是仍是未找到,則報錯blog
注意:在上述查找過程當中,一旦找到,則尋找過程當即中斷,便不會再繼續找了繼承
繼承原理(python如何實現的繼承)數學
python究竟是如何實現繼承的,對於你定義的每個類,python會計算出一個方法解析順序(MRO)列表,這個MRO列表就是一個簡單的全部基類的線性順序列表,例如
>>> F.mro() #等同於F.__mro__ [<class '__main__.F'>, <class '__main__.D'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]
爲了實現繼承,python會在MRO列表上從左到右開始查找基類,直到找到第一個匹配這個屬性的類爲止。而這個MRO列表的構造是經過一個C3線性化算法來實現的。咱們不去深究這個算法的數學原理,它實際上就是合併全部父類的MRO列表並遵循以下三條準則:1.子類會先於父類被檢查2.多個父類會根據它們在列表中的順序被檢查3.若是對下一個類存在兩個合法的選擇,選擇第一個父類