自學(xué)整理記錄,大神見笑
類的結(jié)構(gòu)
實例
- 創(chuàng)建對象過程
1.創(chuàng)建類
2.使用類名()創(chuàng)建對象,在內(nèi)存中為對象分配空間,然后調(diào)用初始化方法__init__為對象初始化
3.對象創(chuàng)建后,內(nèi)存中就有實實在在的存在,即實例 - 創(chuàng)建出來的對象叫做類的實例,創(chuàng)建對象的動作叫做實例化,對象屬性也叫實例屬性,對象方法也叫實例方法
- 對象各自擁有自己的實例屬性,調(diào)用對象方法和對象屬性用self.調(diào)用
- 每個對象都有獨立的內(nèi)存空間,保存各自的屬性,而多個對象的方法在內(nèi)存中只有一份,調(diào)用時需要把對象引用傳遞到方法內(nèi)部
類是一個特殊的對象
- 程序運行,類也會被加載到內(nèi)存
- 類是一個特殊的對象,即類對象
- 程序運行,類對象在內(nèi)存中只有一份,使用一個類可以創(chuàng)建出多個對象實例
- 類除了封裝實例的屬性和方法,自己也有屬性和方法,即類屬性和類方法
- 通過類名.調(diào)用類屬性和類方法
類屬性和實例屬性
- 類屬性就是個類對象定義的屬性
- 通常記錄這個類的特征
- 類屬性不會用于記錄具體對象的特征
- 使用賦值語句在class關(guān)鍵字下方就可定義類屬性
- 可以用類名.類屬性訪問類屬性
屬性獲取機制
- 屬性的獲取存在一個向上查找機制,首先在對象內(nèi)部查找對象屬性,沒有找到就向上尋找類屬性
- 因此還可以對象.類屬性調(diào)用,但不推薦,易混淆
- 注意:如果對象.類屬性 = 值賦值語句,這樣只會給對象添加一個屬性
類方法和靜態(tài)方法
類方法
- 類屬性是針對類對象定義的屬性,類方法是針對類對象定義的方法
- 類方法內(nèi)部可以直接訪問類屬性或者調(diào)用其他的類方法
- 語法如下:
@classmethod
def 類方法名(cls):
?pass
- 類方法需要用修飾器@classmethod來標(biāo)識,讓解釋器知道這是一個類方法
- 類方法第一個參數(shù)是cls,類似對象的self,代表哪一個類的引用
- 通過類名.調(diào)用類方法,不需要傳遞cls參數(shù)
- 在方法內(nèi)部,可以通過cls.訪問類屬性和其他類方法
靜態(tài)方法
- 類中封裝一個方法,既不訪問類屬性和類方法,也不訪問實例屬性和實例方法,可以將該方法封裝成一個靜態(tài)方法
- 語法如下:
@staticmethod
def 靜態(tài)方法名():
?pass
- 靜態(tài)方法需要修飾器@staticmethod
- 通過類名.調(diào)用靜態(tài)方法
- 如何確定方法類型:
1.實例方法---方法內(nèi)部需要訪問實例屬性;可以使用類名.訪問類屬性
2.類方法---方法內(nèi)部只需要訪問類屬性
3.靜態(tài)方法---方法內(nèi)部不需要訪問實例屬性和類屬性
單例
單例設(shè)計模式
- 設(shè)計模式就是根據(jù)特定場景的一種解決方案
- 單例設(shè)計模式,就是讓類創(chuàng)建的實例在內(nèi)存中只能存在一個,每次創(chuàng)建的對象,其引用都是相同的
__new__方法
- __new__是object基類的內(nèi)置靜態(tài)方法,作用是在內(nèi)存中為對象分配空間
- Python解釋器獲得對象的引用后,將引用作為第一個參數(shù),傳遞給__init__方法
- 重寫__new__方法一定要**return super().__new__(cls),否則Python解釋器得不到對象引用,就不會調(diào)用對象的初始化方法
- 重寫 __new__方法的代碼非常固定
- 注意:__new__是一個靜態(tài)方法,在調(diào)用時需要主動傳遞cls參數(shù)
- 單例代碼如下:
class MusicPlayer(object):
?instance = None
?init_flag = False
?def __new__(cls,*args,**kwargs):
?
??if cls.instance is None:
???cls.instance = super().__new__(cls)
??return cls.instance
?def __init__(self):
??if MusicPlayer.init_flag:
??return
??MusicPlayer.init_flag = True