Python單例模式實(shí)例詳解
本文實(shí)例講述了Python單例模式。分享給大家供大家參考,具體如下:
單例模式:保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問(wèn)他的全局訪問(wèn)點(diǎn)。
實(shí)現(xiàn)某個(gè)類只有一個(gè)實(shí)例的途徑:
1,讓一個(gè)全局變量使得一個(gè)對(duì)象被訪問(wèn),但是他不能防止外部實(shí)例化多個(gè)對(duì)象。
2,讓類自身保存他的唯一實(shí)例,這個(gè)類可以保證沒(méi)有其他實(shí)例可以被創(chuàng)建。
多線程時(shí)的單例模式:加鎖-雙重鎖定
餓漢式單例類:在類被加載時(shí)就將自己實(shí)例化(靜態(tài)初始化)。其優(yōu)點(diǎn)是躲避了多線程訪問(wèn)的安全性問(wèn)題,缺點(diǎn)是提前占用系統(tǒng)資源。
懶漢式單例類:在第一次被引用時(shí),才將自己實(shí)例化。避免開(kāi)始時(shí)占用系統(tǒng)資源,但是有多線程訪問(wèn)安全性問(wèn)題。
實(shí)例:
#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('初始化實(shí)例') Singleton.instance=Singleton() else: PrintInfo('單例已經(jīng)實(shí)例化') Singleton.mutex.release() else: PrintInfo('單例已經(jīng)實(shí)例化') return Singleton.instance def clientUI(): Singleton.GetInstance() Singleton.GetInstance() Singleton.GetInstance() return if __name__=='__main__': clientUI();
結(jié)果:
初始化實(shí)例 單例已經(jīng)實(shí)例化 單例已經(jīng)實(shí)例化
追加解釋 @staticmethod 在 Python中提到 classmethod 就要提到 staticmethod,不是因?yàn)槎哂惺裁搓P(guān)系,而是為了讓用戶區(qū)分以便更清楚地寫(xiě)代碼。在C++中,我們了解直接通過(guò)類名訪問(wèn)的函數(shù)稱為類的靜態(tài)函數(shù),即static修飾的函數(shù),可見(jiàn)C++中classmethod和staticmethod是一個(gè)概念。 那么python中二者有什么區(qū)別呢?先來(lái)看下二者如何在python代碼中聲明
class MyClass: ... @classmethod # classmethod的修飾符 def class_method(cls, arg1, arg2, ...): ... @staticmethod # staticmethod的修飾符 def static_method(arg1, arg2, ...): ...
對(duì)于classmethod的參數(shù),需要隱式地傳遞類名,而staticmethod參數(shù)中則不需要傳遞類名,其實(shí)這就是二者最大的區(qū)別。
二者都可以通過(guò)類名或者類實(shí)例對(duì)象來(lái)調(diào)用,因?yàn)閺?qiáng)調(diào)的是classmethod和staticmethod,所以在寫(xiě)代碼的時(shí)候最好使用類名,良好的編程習(xí)慣吧。
對(duì)于staticmethod就是為了要在類中定義而設(shè)置的,一般來(lái)說(shuō)很少這樣使用,可以使用模塊級(jí)(module-level)的函數(shù)來(lái)替代它。既然要把它定義在類中,想必有作者的考慮。
對(duì)于classmethod,可以通過(guò)子類來(lái)進(jìn)行重定義。
提到類級(jí)別的函數(shù),也順帶提及類級(jí)別的變量
class MyClass: i = 123 # class-level variable def __init__(self): self.i = 456 # object-level variable ...
為了清晰地區(qū)分上面兩個(gè)i,最好的辦法就是考慮到python中的一切都是object,所以i=123屬于class object的,i=456屬于class instance object
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python Socket編程技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
解決python圖像處理圖像賦值后變?yōu)榘咨膯?wèn)題
這篇文章主要介紹了解決python圖像處理圖像賦值后變?yōu)榘咨膯?wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06Python中的數(shù)據(jù)可視化matplotlib與繪圖庫(kù)模塊
這篇文章介紹了Python中的數(shù)據(jù)可視化matplotlib與繪圖庫(kù)模塊,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05利用python和ffmpeg 批量將其他圖片轉(zhuǎn)換為.yuv格式的方法
今天小編就為大家分享一篇利用python和ffmpeg 批量將其他圖片轉(zhuǎn)換為.yuv格式的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01對(duì)DataFrame數(shù)據(jù)中的重復(fù)行,利用groupby累加合并的方法詳解
今天小編就為大家分享一篇對(duì)DataFrame數(shù)據(jù)中的重復(fù)行,利用groupby累加合并的方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01Python生成可執(zhí)行文件之PyInstaller庫(kù)的使用方式
PyInstaller是一個(gè)十分有用的第三方庫(kù),通過(guò)對(duì)源文件打包,Python程序可以在沒(méi)有安裝Python的環(huán)境中運(yùn)行,也可以作為一個(gè)獨(dú)立文件方便傳遞和管理,下面這篇文章主要給大家介紹了關(guān)于Python生成可執(zhí)行文件之PyInstaller庫(kù)的使用方式,需要的朋友可以參考下2022-04-04