本文實例講述了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();
#結果:
##
初始化实例 单例已经实例化 单例已经实例化
class MyClass: ... @classmethod # classmethod的修饰符 def class_method(cls, arg1, arg2, ...): ... @staticmethod # staticmethod的修饰符 def static_method(arg1, arg2, ...): ...
class MyClass: i = 123 # class-level variable def __init__(self): self.i = 456 # object-level variable ...