1、什麼是經典類,什麼新式類?python
經典類、新式類是站在類否繼承 object 類的前提下的一個命名, 一個概念。算法
1.1 定義:python3.x
經典類: 當前類沒有繼承 object 類,那麼當前類就是 經典類。python2.7
新式類:當前類繼承 object 類,那麼當前類就是 新式類。spa
1.2 在ptyhon的不一樣版本中,經典類與新式類的存在狀況不同code
1.2.1 在 python3.X 版本中,因爲全部的類 默認都繼承 object類,因此有的類 都是 新式類。blog
結論:在python3.x版本中,只有新式類。繼承
解釋器爲python3.6 環境
class Person1:pass # 默認繼承 object 類 class Person2(object):pass print(Person1.__bases__) # (<class 'object'>,) print(Person2.__bases__) # (<class 'object'>,) print(Person1.__dict__) # 返回一個字典,字典中存放了 類的全部屬性和值
1.2.2 在python2.7 版本中,全部的類 ,默認都不繼承 object 類,因此默認狀況下,類就是經典類,若是顯示聲明一個類 繼承 object 類,或者 一個類 經過 繼承關係的傳遞 繼承了object類,那麼就成爲新式類。class
結論:在python 2.7 版本中,經典類和新式類 並存。object
# 如下是在python2.7環境中執行的命令結果: class Person3: pass # 默認不繼承(不主動) object 類 print(Person3.__bases__) # () class Person4(object):pass # 顯示聲明一個類 繼承 object 類 print(Person4.__bases__) # (<type 'object'>,) class Base: def func(self): print("我是Base類") class child: def func(selfself): print("我是child類") print(issubclass(child,object)) # False 在python2.7 中,在默認狀況下 ,都不繼承 object類,是經典類 print(issubclass(Base,object)) # False class Base(object): # 顯示聲明一個類 繼承 object 類 def func(self): print("我是Base類") class child(Base): def func(selfself): print("我是child類") print(issubclass(child,object)) # True 可見繼承具備傳遞性 print(issubclass(Base,object)) # True
1.3 當類是 經典類 或者 新式類 時,在多繼承環境下,從父類中尋找 成員的順序問題,或者叫找尋父類成員的方式:
1.3.1 當類是 經典類 時,在多繼承環境下,會按照 「深度優先方式」 查找:
# 經典類,在多繼承環境,在父類中尋找成員的方式,遵循 「深度優先」 原則 class G: # def find(self): # print("G") pass class A: # def find(self): # print("A") pass class B(A): # def find(self): # print("B") pass class C(A): # def find(self): # print("C") pass class D(B,G): # def find(self): # print("D") pass class E(C): # def find(self): # print("E") pass class F(D,E): # def find(self): # print("F") pass f_obj = F() f_obj.find() # F --> D --> B --> A --> G --> E --> C -->
總結:「深度優先」查找方式,從當前類開始查找 成員屬性或方法 ,當前類沒有,則查找 第一個繼承的父類 ,若沒有,則查找父類的父類,沿着父類的父類....,一直查找下去,查找到到就執行,若一直查找到了最頂層的類,則沿原路返回,看有沒有未查找的節點,左樹枝查找完畢沒有,則回到 當前類 這個根節點,查找第二個直接繼承的節點,的右樹枝。依次類推。
1.3.2 當前類 是 新式類 時, 在多繼承環境下,查找父類的成員時,會遵循 「廣度優先」方式 查找:
結論: 當 嘗試 從B的父類 A 查找成員時,因爲A 有兩條路徑,能夠達到,直接回到 F 類,開始另外一個分支的查找
==
==
---
----
==
====
1.4 經典類和新式類的特色:
1.4.1 新式類:
全部的多繼承關係尋找 方法的順序 --- 遵循廣度優先算法
繼承object
mro方法
super(); super 不是單純的找父類,而是遵循mro順序
1.4.2 經典類
不主動繼承object
經典類在找父類方法的過程當中,遵循 深度優先
不提供mro方法 和 super