您好,登錄后才能下訂單哦!
python的新式類(lèi)是2.2版本引進(jìn)來(lái)的,我們可以將之前的類(lèi)叫做經(jīng)典類(lèi)或者舊式類(lèi)。
為什么要在2.2中引進(jìn)new style class呢?官方給的解釋是:
為了統(tǒng)一類(lèi)(class)和類(lèi)型(type)。
在2.2之前,比如2.1版本中,類(lèi)和類(lèi)型是不同的,如a是ClassA的一個(gè)實(shí)例,那么a.__class__返回 ‘ class __main__.ClassA‘ ,type(a)返回總是<type 'instance'>。而引入新類(lèi)后,比如ClassB是個(gè)新類(lèi),b是ClassB的實(shí)例,b.__class__和type(b)都是返回‘class '__main__.ClassB' ,這樣就統(tǒng)一了。
引入新類(lèi)后,還有其他的好處,比如更多的內(nèi)置屬性將會(huì)引入,描述符的引入,屬性可以來(lái)計(jì)算等等。
為了向前兼容,默認(rèn)情況下用戶定義的類(lèi)為經(jīng)典類(lèi),新類(lèi)需要繼承自所有類(lèi)的基類(lèi) object 或者繼承自object的新類(lèi)。
值得注意的地方是,雖然使用的是最新的python(2.7),但是一些特性不會(huì)在舊式類(lèi)起作用。
Python中類(lèi)分兩種:舊式類(lèi)和新式類(lèi):
新式類(lèi)都從object繼承,經(jīng)典類(lèi)不需要。
新式類(lèi)的MRO(method resolution order 基類(lèi)搜索順序)算法采用C3算法廣度優(yōu)先搜索,而舊式類(lèi)的MRO算法是采用深度優(yōu)先搜索
新式類(lèi)相同父類(lèi)只執(zhí)行一次構(gòu)造函數(shù),經(jīng)典類(lèi)重復(fù)執(zhí)行多次。
其中:
所以,為了確保自己使用的是新式類(lèi),有兩種以下方法:
1. 元類(lèi),在類(lèi)模塊代碼的最前面加入如下代碼 __metaclass__ = classname(自定義的某個(gè)新式類(lèi))。
2. 類(lèi)都從內(nèi)建類(lèi)object直接或者間接地繼承。
如果不需要兼容舊式類(lèi),舊版本的類(lèi),那么就保持都是新式類(lèi)。
在Python3里面,不存在這些問(wèn)題了,因?yàn)樗械念?lèi)都是object類(lèi)的子類(lèi)(隱式)。
代碼示例:
class oldClass: #經(jīng)典類(lèi) def __init__( self ): pass class newClass(object): #新類(lèi) def __init__( self ): pass c1 = oldClass() c2 = newClass() c1.__class__ # 輸出-> <class __main__.oldClass at 0x0137BF10> type(c1) # 輸出-> <type 'instance'> c2.__class__ # 輸出-><class '__main__.newClass'> type(c2) # 輸出-><class '__main__.newClass'>
Python2.x中:
class A: pass class B: pass class C(B): pass class D(C,A): pass
執(zhí)行順序?yàn)椋篋->C->B,->A
class A(object): pass class B(object): pass class C(object): pass class D(A,B,C): pass
執(zhí)行順序?yàn)椋?nbsp;D->A->B->C->Object
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。