前言
本文主要介紹了關(guān)于Python實(shí)例化class的執(zhí)行順序的相關(guān)內(nèi)容,下面話不多說了,來一起看看詳細(xì)的介紹吧
Python里對(duì)類的實(shí)例化時(shí)有怎樣的順序
一般來說一個(gè)類里面有類變量和方法,比如我們定義一個(gè)名為A的類
class A(): bar = "my lover love me" def __init__(self, name): print('A的class' ,self.__class__, name)我們?cè)谶@個(gè)類里面定義了一個(gè)類變量bar和一個(gè)構(gòu)造方法__init__,那么我們實(shí)例化A()時(shí)都發(fā)生了什么呢!看官不要急,聽我慢慢道來...
首先,python 調(diào)用內(nèi)置的type類,沒有聽錯(cuò),就是我們平時(shí)用來測(cè)引用類型的那個(gè)type,然后type調(diào)用內(nèi)置的元類mateClass,mateClass再調(diào)用__new__方法將類實(shí)例化,此時(shí)完成了第一步 然后,這個(gè)實(shí)例將會(huì)初始化自己的類變量,就是把自己從頭到尾掃視一遍, 之后,進(jìn)入構(gòu)造方法,并初始化自己的實(shí)例變量。注意:python中類變量和實(shí)例變量是不一樣的,
類變量:不用實(shí)例化也可以訪問。
實(shí)例變量:是動(dòng)態(tài)創(chuàng)建的。必須實(shí)例化之后才可以訪問,因?yàn)橹笆遣淮嬖诘摹?/p>
比如下面這個(gè)例子:不實(shí)例化訪問類變量
class A(): a = 2print(A.a)
輸出:
>>>2
說了這么多,上代碼。看看類繼承時(shí)怎么運(yùn)行的:
class A(): def __init__(self, name): print('A的class' ,self.__class__, name) class B(A): def __init__(self, name): self._name = name A.__init__(self, name) print('B的class', self.__class__, name) print('this is B class') class C(B): def __init__(self, name): B.__init__(self, name) print('C的class') if __name__ == '__main__':c = C('lee')輸出如下:
this is B class
A class <class '__main__.C'> lee
B class <class '__main__.C'> lee
C class
來現(xiàn)身說法,解釋一波
首先對(duì)class C()進(jìn)行實(shí)例化,從頭到尾掃一遍,然后進(jìn)入C()的構(gòu)造,遇到了父類C()的構(gòu)造方法B.__init__ 。 進(jìn)入class B(),從頭到尾掃一遍,執(zhí)行了print('this is B class')語句然后進(jìn)入B()的構(gòu)造,遇到了父類B()的構(gòu)造方法A.__init__。 進(jìn)入class A(),從頭到尾掃一遍,然后進(jìn)入A()的構(gòu)造方法A.__init__。然后A.__init__執(zhí)行完畢并彈出棧,class A()執(zhí)行完畢并彈出棧。 回到class B(),從上次未執(zhí)行完的地方print('B的class', self.__class__, name)繼續(xù)執(zhí)行。然后B.__init__執(zhí)行完畢并彈出棧,class B()執(zhí)行完畢并彈出棧。 回到class C(),從上次未執(zhí)行完的地方print('C的class')繼續(xù)執(zhí)行。然后C.__init__執(zhí)行完畢并彈出棧,class C()執(zhí)行完畢并彈出棧。程序運(yùn)行完畢。 由于是對(duì)class C()進(jìn)行實(shí)例化,上面的self都是指class C()的實(shí)例而不是class A()的或者class B()的。因此self.__class__清一色的顯示
新聞熱點(diǎn)
疑難解答
圖片精選