。這反映了所有的舊式類(lèi)的實(shí)例是通過(guò)一個(gè)單一的叫做instance的內(nèi)建類(lèi)型來(lái)實(shí)現(xiàn)的,這是它和類(lèi)不同的地方。" />
更新時(shí)間:2018-11-26 來(lái)源:黑馬程序員 瀏覽量:
1. 截止到python2.1,只存在舊式類(lèi)。舊式類(lèi)中,類(lèi)名和type是無(wú)關(guān)的:如果x是一個(gè)舊式類(lèi),那么x.__class__定義了x的類(lèi)名,但是type(x)總是返回<type 'instance'>。這反映了所有的舊式類(lèi)的實(shí)例是通過(guò)一個(gè)單一的叫做instance的內(nèi)建類(lèi)型來(lái)實(shí)現(xiàn)的,這是它和類(lèi)不同的地方。
2. 新式類(lèi)是在python2.2為了統(tǒng)一類(lèi)和實(shí)例引入的。一個(gè)新式類(lèi)只能由用戶(hù)自定義。如果x是一個(gè)新式類(lèi)的實(shí)例,那么type(x)和x.__class__是一樣的結(jié)果(盡管這不能得到保證, 因?yàn)樾率筋?lèi)的實(shí)例的__class__方法是允許被用戶(hù)覆蓋的)。
3. Python 2.x中默認(rèn)都是經(jīng)典類(lèi),只有顯式繼承了object才是新式類(lèi)
4. Python 3.x中默認(rèn)都是新式類(lèi),經(jīng)典類(lèi)被移除,不必顯式的繼承
5. 新式類(lèi)的MRO算法采用C3算法廣度優(yōu)先搜索,而舊式類(lèi)的MRO算法是采用深度優(yōu)先搜索
6. 新式類(lèi)相同父類(lèi)只執(zhí)行一次__init__函數(shù),經(jīng)典類(lèi)重復(fù)執(zhí)行多次。
Python2.X中:
執(zhí)行順序?yàn)椋篋>C>A>B
Python3.X中:
執(zhí)行順序?yàn)椋篋>C>B>A>object
作者:傳智播人工智能+Python培訓(xùn)學(xué)院
首發(fā):http://python.itheima.com