在python 2及以前的版本中,由任意內建型別派生出的類(只要乙個內建型別位於類樹的某個位置),都屬於「新式類」,都會獲得所有「新式類」的特性;反之,即不由任意內建型別派生出的類,則稱之為「經典類」。
python2.x中,預設都是經典類,只有顯式繼承了object才是新式類,即:
class person(object):pass 新式類寫法
class person():pass 經典類寫法
class person:pass 經典類寫法
「新式類」和「經典類」的區分在python 3之後就已經不存在,在python 3.x之後的版本,因為所有的類都派生自內建型別object(即使沒有顯示的繼承object型別),即所有的類都是「新式類」。
在python 3.x中取消了經典類,預設都是新式類,並且不必顯式的繼承object,也就是說:
class person(object):pass
class person():pass
class person:pass
三種寫法並無區別,推薦第一種
官方文件
繼承搜尋的順序發生了改變,經典類多繼承屬性搜尋順序: 先深入繼承樹左側,再返回,開始找右側;新式類多繼承屬性搜尋順序: 先水平搜尋,然後再向上移動
# -*- coding:utf-8 -*-
class a(object):
"""新式類
作為所有類的基類
"""def foo(self):
print "class a"
class a1():
"""經典類
作為所有類的基類
"""def foo(self):
print "class a1"
class c(a):
pass
class c1(a1):
pass
class d(a):
def foo(self):
print "class d"
class d1(a1):
def foo(self):
print "class d1"
class e(c, d):
pass
class e1(c1, d1):
pass
e = e()
e.foo()
e1 = e1()
e1.foo()
輸出class d
class a1
因為a新式類,對於繼承a類都是新式類,首先要查詢類e中是否有foo(),如果沒有則按順序查詢c->d->a。它是一種廣度優先查詢方式。
因為a1經典類,對於繼承a1類都是經典類,首先要查詢類e1中是否有foo(),如果沒有則按順序查詢c1->a1->d1。它是一種深度優先查詢方式。
Python新式類與經典類的區別
經典類和新式類的繼承順序 class a def init self print a class b a def init self print b pass class c a def init self print c pass class d b,c 這種情況,是先走本身的建構函式,然後根據順...
Python新式類與經典類 舊式類 的區別
新式類都從object繼承,經典類不需要。新式類的 mro method resolution order 基類搜尋順序 演算法 採用c3演算法廣度優先搜尋,而舊式類的 mro演算法 是採用深度優先搜尋 新式類相同父類只執行一次建構函式,經典類重複執行多次。截止到python2.1,只存在舊式類。舊...
Python新式類與經典類 舊式類 的區別
新式類都從object繼承,經典類不需要。新式類的 mro method resolution order 基類搜尋順序 演算法 採用c3演算法廣度優先搜尋,而舊式類的 mro演算法 是採用深度優先搜尋 新式類相同父類只執行一次建構函式,經典類重複執行多次。截止到python2.1,只存在舊式類。舊...