python的init方法一定會執(zhí)行嗎 python中如何快速創(chuàng)建多個對象?
python中如何快速創(chuàng)建多個對象?讓 讓我們先談?wù)劵靖拍?。我稱未初始化的類為類對象,初始化的類為實(shí)例對象。類對象中有一個字典,里面存儲了類域下的所有函數(shù)對象。其中,用@classmethod修飾一
python中如何快速創(chuàng)建多個對象?
讓 讓我們先談?wù)劵靖拍?。我稱未初始化的類為類對象,初始化的類為實(shí)例對象。
類對象中有一個字典,里面存儲了類域下的所有函數(shù)對象。
其中,用@classmethod修飾一個函數(shù)后,該函數(shù)就變成了一個類方法,在生成類對象時被實(shí)例化,并傳入一個參數(shù)。通常,這個參數(shù)稱為cls。
函數(shù)用@staticmethod修飾后,也是類的靜態(tài)方法,但默認(rèn)情況下不會傳遞cls參數(shù)。
如果你不 t用上面的decorator來修飾它,這個函數(shù)是類的一個實(shí)例方法,默認(rèn)會傳遞一個參數(shù),這個參數(shù)通常命名為self。
而這個自我在傳遞給實(shí)例方法之前,需要由__init__函數(shù)執(zhí)行,這就是初始化。
但是python是一種動態(tài)語言,上面的規(guī)則基本都是約定俗成的,在解釋器中沒有很強(qiáng)的約束。
分類是必要的,你這里不帶參數(shù)的方法要?dú)w入staticmethod,在實(shí)際使用中要加一個修飾符,規(guī)定這是staticmethod。
什么?;這種方法有什么用?事實(shí)上,它 沒什么用處。classmethod是必需的,但staticmethod不是。
我只在使用class作為作用域或者使用class作為字典時使用這個方法。
如何理解并正確使用python中的self?
在學(xué)習(xí)如何定義類的過程中,無論是顯式創(chuàng)建類構(gòu)造函數(shù),還是在類中添加實(shí)例方法,都需要將self參數(shù)作為方法的第一個參數(shù)。例如,按如下定義Dog類:
一個
二
三
四
五
六
Class dog :
def __init__(self):
打印(執(zhí)行構(gòu)造函數(shù))
#定義一個jump()實(shí)例方法
Define jump (self) :
打印(執(zhí)行跳轉(zhuǎn)方法)
Python要求類方法(構(gòu)造函數(shù)和實(shí)例方法)至少要包含一個參數(shù),但并沒有指定這個參數(shù)的名稱(根本可以叫任何參數(shù)名)。類方法的第一個參數(shù)之所以命名為self,只是Python程序員的一個約定。一個讓程序可讀性更強(qiáng)的習(xí)慣。
換句話說,同一個類可以產(chǎn)生多個對象。當(dāng)一個對象調(diào)用一個類方法時,該對象會自動將自己的引用作為第一個參數(shù)傳遞給該方法。換句話說,Python會自動將類方法的第一個參數(shù)綁定到調(diào)用該方法的對象。那么,皮索解釋器可以知道哪個對象 的方法來操作。對于構(gòu)造函數(shù),self參數(shù)(第一個參數(shù))表示構(gòu)造函數(shù)正在初始化的對象。
因此,程序在調(diào)用實(shí)例方法和構(gòu)造函數(shù)時不需要為第一個參數(shù)傳遞值。例如,將前面的Dog類更改如下:
一個
二
三
四
五
六
七
八
九
十
十一
十二
十三
十四
十五
Class dog :
def __init__(self):
打印(自身,調(diào)用構(gòu)造函數(shù))
#定義一個jump()方法
Define jump (self) :
打印(自身,執(zhí)行跳轉(zhuǎn)方法)
#定義一個run()方法,這個方法需要jump()方法的幫助。
Defining Operation (Self) :
打印(自身,執(zhí)行運(yùn)行方法)
#使用self參數(shù)引用調(diào)用run()方法的對象。
self.jump()
dog1狗()
()
dog2狗()
()