這裡有個重要概念呢在下面那個鏈結
1、新式類都從object繼承,經典類不需要。
2、新式類的mro(method resolution order 基類搜尋順序)演算法採用c3演算法廣度優先搜尋,而舊式類的mro演算法是採用深度優先搜尋
3、新式類相同父類只執行一次建構函式,經典類重複執行多次。
( python 2.x中預設都是經典類,只有顯式繼承了object才是新式類
python 3.x中預設都是新式類,經典類被移除,不必顯式的繼承object )
乙個舊式類的深度優先的例子
class a():def foo1(self):
"a"class b(a):
def foo2(self):
pass
class c(a):
def foo1(self):
"c"class d(b, c):
passd =
d()d.foo1()
# a
按照經典類的查詢順序從左到右深度優先
的規則,在訪問d.foo1()
的時候,d這個類是沒有的..那麼往上查詢,先找到b,裡面沒有,深度優先,訪問a,找到了foo1(),所以這時候呼叫的是a的foo1(),從而導致c重寫的foo1()被繞過
參考:
python 新式類和舊式類
python的新式類是2.2版本引進來的,我們可以將之前的類叫做經典類或者舊類。為什麼要在2.2中引進new style class呢?官方給的解釋是 為了統一類 class 和型別 type 在2.2之前,比如2.1版本中,類和型別是不同的,如a是classa的乙個例項,那麼a.class 返回 ...
python 新式類和舊式類
新式類和舊式類 python的新式類是2.2版本引進來的,我們可以將之前的類叫做經典類或者舊類。為什麼要在2.2中引進new style class呢?官方給的解釋是 為了統一類 class 和型別 type 在2.2之前,比如2.1版本中,類和型別是不同的,如a是classa的乙個例項,那麼a.c...
python 新式類和舊式類
python的新式類是2.2版本引進來的,我們可以將之前的類叫做經典類或者舊類。為什麼要在2.2中引進new style class呢?官方給的解釋是 為了統一類 class 和型別 type 在2.2之前,比如2.1版本中,類和型別是不同的,如a是classa的乙個例項,那麼a.class 返回 ...