python單例模式)

來源:互聯網
上載者:User

單例模式:保證一個類僅有一個執行個體,並提供一個訪問他的全域訪問點。

 

實現某個類只有一個執行個體的途徑:

1,讓一個全域變數使得一個對象被訪問,但是他不能防止外部執行個體化多個對象。

2,讓類自身儲存他的唯一執行個體,這個類可以保證沒有其他執行個體可以被建立。

多線程時的單例模式:加鎖-雙重鎖定

餓漢式單例類:在類被載入時就將自己執行個體化(靜態初始化)。其優點是躲避了多線程訪問的安全性問題,缺點是提前佔用系統資源。

懶漢式單例類:在第一次被引用時,才將自己執行個體化。避免開始時佔用系統資源,但是有多線程訪問安全性問題。

執行個體:

 

#encoding=utf-8#單例模式def PrintInfo(info):#    print unicode(info,'utf-8').decode('gbk')    print info.decode('utf-8').encode('utf-8')  import threading#單例類class Singleton():    instance=None    mutex=threading.Lock()    def _init__(self):        pass    @staticmethod    def GetInstance():        if(Singleton.instance==None):            Singleton.mutex.acquire()            if(Singleton.instance==None):                PrintInfo('初始化執行個體')                Singleton.instance=Singleton()            else:                PrintInfo('單例已經執行個體化')            Singleton.mutex.release()        else:            PrintInfo('單例已經執行個體化')                   return Singleton.instancedef clientUI():    Singleton.GetInstance()    Singleton.GetInstance()    Singleton.GetInstance()       returnif __name__=='__main__':    clientUI();

 

結果:

初始化執行個體 單例已經執行個體化 單例已經執行個體化        

追加解釋 @staticmethod 在 Python中提到 classmethod 就要提到 staticmethod,不是因為二者有什麼關係,而是為了讓使用者區分以便更清楚地寫代碼。在C++中,我們瞭解直接通過類名訪問的函數稱為類的靜態函數,即static修飾的函數,可見C++中classmethod和staticmethod是一個概念。 那麼python中二者有什麼區別呢?先來看下二者如何在python代碼中聲明 

class MyClass: ...   @classmethod  # classmethod的修飾符  def class_method(cls, arg1, arg2, ...):   ...  @staticmethod  # staticmethod的修飾符  def static_method(arg1, arg2, ...):   ...

對於classmethod的參數,需要隱式地傳遞類名,而staticmethod參數中則不需要傳遞類名,其實這就是二者最大的區別。
二者都可以通過類名或者類執行個體對象來調用,因為強調的是classmethod和staticmethod,所以在寫代碼的時候最好使用類名,良好的編程習慣吧。
對於staticmethod就是為了要在類中定義而設定的,一般來說很少這樣使用,可以使用模組層級(module-level)的函數來替代它。既然要把它定義在類中,想必有作者的考慮。
對於classmethod,可以通過子類來進行重定義。
提到類層級的函數,也順帶提及類層級的變數

 

class MyClass:  i = 123 # class-level variable  def __init__(self):  self.i = 456 # object-level variable  ...

 

為了清晰地區分上面兩個i,最好的辦法就是考慮到python中的一切都是object,所以i=123屬於class object的,i=456屬於class instance object

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.