本文實例講述了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.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
更多關于Python相關內容感興趣的讀者可查看本站專題:《Python數據結構與算法教程》、《Python Socket編程技巧總結》、《Python函數使用技巧總結》、《Python字符串操作技巧匯總》、《Python入門與進階經典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對大家Python程序設計有所幫助。
新聞熱點
疑難解答
圖片精選