Python中實例化class的執(zhí)行順序示例詳解
前言
本文主要介紹了關于Python實例化class的執(zhí)行順序的相關內(nèi)容,下面話不多說了,來一起看看詳細的介紹吧
Python里對類的實例化時有怎樣的順序
一般來說一個類里面有類變量和方法,比如我們定義一個名為A的類
class A():
bar = "my lover love me"
def __init__(self, name):
print('A的class' ,self.__class__, name)
我們在這個類里面定義了一個類變量bar和一個構造方法__init__,那么我們實例化A()時都發(fā)生了什么呢!看官不要急,聽我慢慢道來...
- 首先,python 調用內(nèi)置的type類,沒有聽錯,就是我們平時用來測引用類型的那個type,然后type調用內(nèi)置的元類mateClass,mateClass再調用__new__方法將類實例化,此時完成了第一步
- 然后,這個實例將會初始化自己的類變量,就是把自己從頭到尾掃視一遍,
- 之后,進入構造方法,并初始化自己的實例變量。
注意:python中類變量和實例變量是不一樣的,
類變量:不用實例化也可以訪問。
實例變量:是動態(tài)創(chuàng)建的。必須實例化之后才可以訪問,因為之前是不存在的。
比如下面這個例子:不實例化訪問類變量
class A(): a = 2 print(A.a)
輸出:
>>>2
說了這么多,上代碼??纯搭惱^承時怎么運行的:
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)身說法,解釋一波
- 首先對class C()進行實例化,從頭到尾掃一遍,然后進入C()的構造,遇到了父類C()的構造方法B.__init__ 。
- 進入class B(),從頭到尾掃一遍,執(zhí)行了
print('this is B class')語句然后進入B()的構造,遇到了父類B()的構造方法A.__init__。 - 進入class A(),從頭到尾掃一遍,然后進入A()的構造方法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í)行完畢并彈出棧。程序運行完畢。 - 由于是對class C()進行實例化,上面的self都是指class C()的實例而不是class A()的或者class B()的。因此self.__class__清一色的顯示
<class '__main__.C'>而不是<class '__main__.A'>或<class '__main__.B'>。
隨便補充一下使用type關鍵字動態(tài)創(chuàng)建類的知識點,敲黑板、、、我要用CET3.5的英語水平向大家翻譯一部分官方文檔對type的描述啦。
使用三個參數(shù),返回一個新類型對象。這實際上是類語句的動態(tài)形式。名稱字符串是類名,并成為__name__屬性;基元元組列出基類并成為>__bases__屬性;并且dict字典是包含類主體定義的命名空間,并被復制到標準字典以成為__dict__屬性。
怎么樣,是不是很拗口,是不是大寫的懵*。so,上代碼,以下兩種寫法輸出一樣的都是輸出:重寫name方法 1
class X(): a = 1 def __name__(self): return '重寫name方法' x =X() print(x.__name__(), x.a)
X = type('重寫name方法', (object,), dict(a = 1))
x = X()
print(X.__name__, x.a)
type動態(tài)創(chuàng)建實例化時,第一個參數(shù)就相當于重寫了類的__name__方法。X類但__name__屬性卻不叫X,呵,好反人類的寫法
還好我們一般不是這么變態(tài),通常我們會將這兩個定義成相同的名字,如下:都叫X
X = type('X', (object,), dict(a = 1))
總結
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關文章
python 實現(xiàn)Requests發(fā)送帶cookies的請求
這篇文章主要介紹了python 實現(xiàn)Requests發(fā)送帶cookies請求的方法,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2021-02-02
Pytorch+PyG實現(xiàn)GraphConv過程示例詳解
這篇文章主要為大家介紹了Pytorch+PyG實現(xiàn)GraphConv過程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-04-04
Python如何實現(xiàn)大型數(shù)組運算(使用NumPy)
這篇文章主要介紹了Python如何實現(xiàn)大型數(shù)組運算,文中講解非常細致,幫助大家更好的了解和學習,感興趣的朋友可以了解下2020-07-07
使用wxPython和Pandas實現(xiàn)XLSX分析器和網(wǎng)頁打開器
這篇文章主要為大家詳細介紹了如何使用wxPython和Pandas實現(xiàn)XLSX分析器和網(wǎng)頁打開器,文中的示例代碼講解詳細,感興趣的可以了解一下2024-10-10

