python中經典類和新式類的區別

2021-10-24 06:43:11 字數 2059 閱讀 7030

在python 2及以前的版本中,不由任意內建型別派生出的類,則稱之為「經典類」。

反之,由任意內建型別派生出的類(只要乙個內建型別位於類樹的某個位置),都屬於「新式類」,都會獲得所有「新式類」的特性;

python在2.2版本中引入了descriptor功能,也正是基於這個功能實現了新式類(new-styel class)的物件模型, 同時解決了之前版本中經典類(classic class)中多重繼承中的mro(method resolution order)的問題, 同時引入了一些新的概念,比如classmethod, staticmethod, super,property等,這些新功能都是基於descriptor 而實現的。

因為python3中所有的類都是新式,這個問題就不復存在了

經典類遵循深度優先的規則,新式類遵循廣度優先的規則。

class a(object):

def __init__(self):

print('a')

class b(a):

pass

class c(a):

def __init__(self):

print('c')

class d(b,c):

pass

r1 = d()

在新式類中,

d是繼承b和

c的,按照順序,首先去找

b,如果在

b裡面能找到例項化物件,便繼承

b,不再往別的地方尋找,如果沒有,就會接著找

c,而不是找

b的父親a!

但是在經典類中,如果

b中找不到,它會優先考慮

b的父親

a,而不是c。

python的mro即method resolution order(方法解析順序),也就是在python中的類的繼承順序是怎樣的。在python2.3之前,mro的實現是基於dfs的,而在python2.3以後mro的實現是基於c3演算法。c3演算法最早被提出是用於lisp的,應用在python中是為了解決原來基於深度優先搜尋演算法不滿足本地優先順序,和單調性的問題。本地優先順序:指宣告時父類的順序,比如c(a,b),如果訪問c類物件屬性時,應該根據宣告順序,優先查詢a類,然後再查詢b類。單調性:如果在c的解析順序中,a排在b的前面,那麼在c的所有子類裡,也必須滿足這個順序。

乙個類的 mro 列表就是合併所有父類的 mro 列表,並遵循以下三條原則:

子類永遠在父類前面

如果有多個父類,會根據它們在列表中的順序被檢查

如果對下乙個類存在兩個合法的選擇,選擇第乙個父類

內建的object物件是所有內建,object物件定義了一系列特殊的方法實現所有物件的預設行為。

__new__, __init__ 方法這兩個方法是用來建立object的子類物件,靜態方法 __new__()用來建立類的例項,然後再呼叫 __init__() 來初始化例項。  

__delattr__ , __getattribute__ , __setattr__方法物件使用這些方法來處理屬性的訪問  

__hash__ , __repr__ , __str__方法print(someobj) 

會呼叫 someobj.__str__() , 如果 __str__ 沒有定義,則會呼叫 someobj.__repr__()

str()

和__repr__()的區別:

可以允許object的子類過載這些方法,或者新增新的方法。

靜態方法可以被類或者例項呼叫,它沒有常規方法的行為(比如繫結,非繫結,預設的第乙個self引數),當有一堆函式僅僅是為了乙個類寫的時候,採用靜態方法宣告在類的內部,可以提供行為上的一致性。建立靜態方法使用裝飾符@staticmethod進行建立。

不管是 類呼叫,還是例項呼叫靜態方法,都是指向同乙個函式物件。

也是可以通過類和它的例項進行呼叫,不過它是有預設第乙個引數,叫做是類物件,一般被 命名為cls,當然你也可以命名為其它名字,這樣就你可以呼叫類物件的一些操作。類方法使用裝飾符@classmethod建立

Python新式類和經典類的區別

從python2.2開始,python 引入了 new style class 新式類 新式類跟經典類的差別主要是以下幾點 新式類物件可以直接通過 class 屬性獲取自身型別 type python view plain copy coding utf 8 class e 經典類 pass cla...

python新式類和經典類的區別

父類或者以上有繼承的object就是新式類 沒有的則是經典類 1,新式類和經典類的區別 廣度優先和深度優先,這主要是在多類繼承的時候會使用到,如下多類繼承的d類對比 新式類 和 經典類 的區分在python 3之後就已經不存在,在python 3.x之後的版本,因為所有的類都派生自內建型別objec...

Python新式類和經典類的區別

從python2.2開始,python 引入了 new style class 新式類 新式類跟經典類的差別主要是以下幾點 新式類物件可以直接通過 class 屬性獲取自身型別 type python view plain copy coding utf 8 class e 經典類 pass cla...