python單例模式(轉)


單例模式:保證一個類僅有一個實例,並提供一個訪問他的全局訪問點。

 

實現某個類只有一個實例的途徑:

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.instance
def clientUI():
    Singleton.GetInstance()
    Singleton.GetInstance()
    Singleton.GetInstance()
   
    return
if __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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM