類屬性、方法和單例

自學(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容