python 新式類與經典類的區別

2021-09-01 02:49:33 字數 1458 閱讀 7484

在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,只存在舊式類。舊...