Python單例模式實(shí)例分析
本文實(shí)例講述了Python單例模式的使用方法。分享給大家供大家參考。具體如下:
方法一
class Singleton(object):
__instance = None
__lock = threading.Lock() # used to synchronize code
def __init__(self):
"disable the __init__ method"
@staticmethod
def getInstance():
if not Singleton.__instance:
Singleton.__lock.acquire()
if not Singleton.__instance:
Singleton.__instance = object.__new__(Singleton)
object.__init__(Singleton.__instance)
Singleton.__lock.release()
return Singleton.__instance
1.禁用__init__方法,不能直接創(chuàng)建對(duì)象。
2.__instance,單例對(duì)象私有化。
3.@staticmethod,靜態(tài)方法,通過類名直接調(diào)用。
4.__lock,代碼鎖。
5.繼承object類,通過調(diào)用object的__new__方法創(chuàng)建單例對(duì)象,然后調(diào)用object的__init__方法完整初始化。
6.雙重檢查加鎖,既可實(shí)現(xiàn)線程安全,又使性能不受很大影響。
方法二:使用decorator
def singleton(cls):
instances = {}
def getInstance():
if cls not in instances:
instances[cls] = cls()
return instances[cls]
return getInstance
@singleton
class SingletonClass:
pass
if __name__ == '__main__':
s = SingletonClass()
s2 = SingletonClass()
print s
print s2
也應(yīng)該加上線程安全
class Sing(object):
def __init__():
"disable the __init__ method"
__inst = None # make it so-called private
__lock = threading.Lock() # used to synchronize code
@staticmethod
def getInst():
Sing.__lock.acquire()
if not Sing.__inst:
Sing.__inst = object.__new__(Sing)
object.__init__(Sing.__inst)
Sing.__lock.release()
return Sing.__inst
希望本文所述對(duì)大家的Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
Python光學(xué)仿真wxpython透鏡演示系統(tǒng)框架
這篇文章主要為大家介紹了Python光學(xué)仿真UI界面的wxpython透鏡演示系統(tǒng)框架基本講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10Python標(biāo)準(zhǔn)庫datetime?date模塊的詳細(xì)介紹
這篇文章主要介紹了Python標(biāo)準(zhǔn)庫datetime?date模塊的詳細(xì)介紹,datetime是Python提供的操作日期和時(shí)間的標(biāo)準(zhǔn)庫,主要有datetime.date模塊、datetime.time模塊及datetime.datetime模塊2022-07-07Python標(biāo)準(zhǔn)庫之urllib和urllib3的使用及說明
這篇文章主要介紹了Python標(biāo)準(zhǔn)庫之urllib和urllib3使用及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12Python獲取任意xml節(jié)點(diǎn)值的方法
這篇文章主要介紹了Python獲取任意xml節(jié)點(diǎn)值的方法,涉及Python操作XML節(jié)點(diǎn)的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-05-05Python數(shù)據(jù)結(jié)構(gòu)與算法之圖的廣度優(yōu)先與深度優(yōu)先搜索算法示例
這篇文章主要介紹了Python數(shù)據(jù)結(jié)構(gòu)與算法之圖的廣度優(yōu)先與深度優(yōu)先搜索算法,結(jié)合實(shí)例形式分析了圖的廣度優(yōu)先與深度優(yōu)先搜索算法原理與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-12-12Windows安裝Anaconda并且配置國內(nèi)鏡像的詳細(xì)教程
我們?cè)趯W(xué)習(xí) Python 的時(shí)候需要不同的 Python 版本,關(guān)系到電腦環(huán)境變量配置換來換去很是麻煩,所以這個(gè)時(shí)候我們需要一個(gè)虛擬的 Python 環(huán)境變量,這篇文章主要介紹了Windows安裝Anaconda并且配置國內(nèi)鏡像教程,需要的朋友可以參考下2023-01-01Django項(xiàng)目打包完整步驟以及可能出現(xiàn)的問題
django項(xiàng)目的結(jié)構(gòu)大體上都是類似,打包主要的功能就是把一些不需要部署的文件剔除,把需要部署的文件直接壓縮打包,下面這篇文章主要給大家介紹了關(guān)于Django項(xiàng)目打包完整步驟以及可能出現(xiàn)問題的相關(guān)資料,需要的朋友可以參考下2023-06-06