Python單例模式實(shí)例詳解
本文實(shí)例講述了Python單例模式。分享給大家供大家參考,具體如下:
單例模式:保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問他的全局訪問點(diǎn)。
實(shí)現(xiàn)某個(gè)類只有一個(gè)實(shí)例的途徑:
1,讓一個(gè)全局變量使得一個(gè)對象被訪問,但是他不能防止外部實(shí)例化多個(gè)對象。
2,讓類自身保存他的唯一實(shí)例,這個(gè)類可以保證沒有其他實(shí)例可以被創(chuàng)建。
多線程時(shí)的單例模式:加鎖-雙重鎖定
餓漢式單例類:在類被加載時(shí)就將自己實(shí)例化(靜態(tài)初始化)。其優(yōu)點(diǎn)是躲避了多線程訪問的安全性問題,缺點(diǎn)是提前占用系統(tǒng)資源。
懶漢式單例類:在第一次被引用時(shí),才將自己實(shí)例化。避免開始時(shí)占用系統(tǒng)資源,但是有多線程訪問安全性問題。
實(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ū)分以便更清楚地寫代碼。在C++中,我們了解直接通過類名訪問的函數(shù)稱為類的靜態(tài)函數(shù),即static修飾的函數(shù),可見C++中classmethod和staticmethod是一個(gè)概念。 那么python中二者有什么區(qū)別呢?先來看下二者如何在python代碼中聲明
class MyClass: ... @classmethod # classmethod的修飾符 def class_method(cls, arg1, arg2, ...): ... @staticmethod # staticmethod的修飾符 def static_method(arg1, arg2, ...): ...
對于classmethod的參數(shù),需要隱式地傳遞類名,而staticmethod參數(shù)中則不需要傳遞類名,其實(shí)這就是二者最大的區(qū)別。
二者都可以通過類名或者類實(shí)例對象來調(diào)用,因?yàn)閺?qiáng)調(diào)的是classmethod和staticmethod,所以在寫代碼的時(shí)候最好使用類名,良好的編程習(xí)慣吧。
對于staticmethod就是為了要在類中定義而設(shè)置的,一般來說很少這樣使用,可以使用模塊級(module-level)的函數(shù)來替代它。既然要把它定義在類中,想必有作者的考慮。
對于classmethod,可以通過子類來進(jìn)行重定義。
提到類級別的函數(shù),也順帶提及類級別的變量
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文件與目錄操作技巧匯總》
希望本文所述對大家Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
如何修復(fù)使用 Python ORM 工具 SQLAlchemy 時(shí)的常見陷阱
SQLAlchemy 是一個(gè) Python ORM 工具包,它提供使用 Python 訪問 SQL 數(shù)據(jù)庫的功能。這篇文章主要介紹了如何修復(fù)使用 Python ORM 工具 SQLAlchemy 時(shí)的常見陷阱,需要的朋友可以參考下2019-11-11
Django自定義YamlField實(shí)現(xiàn)過程解析
這篇文章主要介紹了Django自定義YamlField實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
Python實(shí)現(xiàn)網(wǎng)頁截圖(PyQT5)過程解析
這篇文章主要介紹了Python實(shí)現(xiàn)網(wǎng)頁截圖(PyQT5)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
Python面向?qū)ο笾o態(tài)屬性、類方法與靜態(tài)方法分析
這篇文章主要介紹了Python面向?qū)ο笾o態(tài)屬性、類方法與靜態(tài)方法,結(jié)合實(shí)例形式分析了Python面向?qū)ο蟪绦蛟O(shè)計(jì)中靜態(tài)屬性、類方法及靜態(tài)方法相關(guān)概念、使用方法及操作注意事項(xiàng),需要的朋友可以參考下2018-08-08
python實(shí)現(xiàn)取余操作的簡單實(shí)例
在本篇文章里小編給各位分享的是一篇關(guān)于python實(shí)現(xiàn)取余操作的簡單實(shí)例內(nèi)容,需要的朋友們可以參考下。2020-08-08
python2.7實(shí)現(xiàn)復(fù)制大量文件及文件夾資料
這篇文章主要為大家詳細(xì)介紹了python2.7實(shí)現(xiàn)復(fù)制大量文件及文件夾資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08
Python密碼學(xué)概述雙倍強(qiáng)度加密教程
這篇文章主要為大家介紹了Python密碼學(xué)概述雙倍強(qiáng)度加密教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>2022-05-05
python實(shí)現(xiàn)手機(jī)銷售管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)手機(jī)銷售管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03

