python實(shí)現(xiàn)單例的兩種方法解讀
python 實(shí)現(xiàn)單例的方法
第一種方法:使用基類
New 是真正創(chuàng)建實(shí)例對(duì)象的方法,所以重寫(xiě)基類的new 方法,以此保證創(chuàng)建對(duì)象的時(shí)候只生成一個(gè)實(shí)例
class Singleton(object): ? ? def __new__(cls, *args, **kwargs): ? ? ? ? # hasattr 判斷是否有...屬性 ? ? ? ? if not hasattr(cls, '_instance'): ? ? ? ? ? ? cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs) ? ? ? ? return cls._instance class Foo(Singleton): ? ? pass foo1 = Foo() foo2 = Foo() print(foo1 is foo2)
第二種方法:使用裝飾器
def Singleton(cls): ? ? instance = {} ? ? def wrapper(*args, **kwargs): ? ? ? ? if cls not in instance: ? ? ? ? ? ? instance[cls] = cls(*args, **kwargs) ? ? ? ? return instance[cls] ? ? return wrapper @Singleton class Foo(object): ? ? pass foo1 = Foo() foo2 = Foo() print(foo1 is foo2)
python 單例對(duì)象
單列模式
單例模式(Singleton Pattern)是一種常用的軟件設(shè)計(jì)模式,該模式的主要目的是確保某 一個(gè)類只有一個(gè)實(shí)例存在。
當(dāng)你希望在整個(gè)系統(tǒng)中,某個(gè)類只能出現(xiàn)一個(gè)實(shí)例時(shí),單例對(duì)象 就能派上用場(chǎng)。
比如,某個(gè)服務(wù)器程序的配置信息存放在一個(gè)文件中,客戶端通過(guò)一個(gè) AppConfig 的類來(lái) 讀取配置文件的信息。
如果在程序運(yùn)行期間,有很多地方都需要使用配置文件的內(nèi)容,也就 是說(shuō),很多地方都需要?jiǎng)?chuàng)建 AppConfig 對(duì)象的實(shí)例,這就導(dǎo)致系統(tǒng)中存在多個(gè) AppConfig 的實(shí)例對(duì)象,而這樣會(huì)嚴(yán)重浪費(fèi)內(nèi)存資源,尤其是在配置文件內(nèi)容很多的情況 下。
事實(shí)上,類似 AppConfig 這樣的類,我們希望在程序運(yùn)行期間只存在一個(gè)實(shí)例對(duì)象。 注意:在python中導(dǎo)入模塊就是一種單例模式
簡(jiǎn)單來(lái)說(shuō)單列模式就是創(chuàng)建單列對(duì)象,重寫(xiě)object類里面的__new__方法使之開(kāi)辟一個(gè)內(nèi)存空間,所有對(duì)象都指向同一內(nèi)存空間,使多個(gè)對(duì)象的引用地址相同
class Dog (object): __instance=None def __new__(cls, *args, **kwargs): if cls.__instance==None: cls.__instance=object.__new__(cls) return cls.__instance else: return cls.__instance dog=Dog() dog1=Dog() print(id(dog)) print(id(dog1))
運(yùn)行結(jié)果:
你會(huì)發(fā)現(xiàn)兩個(gè)對(duì)象的id一樣 這也就說(shuō)明兩個(gè)對(duì)象指向的內(nèi)存地址就一樣,這個(gè)就是單例對(duì)象
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python的collections模塊中namedtuple結(jié)構(gòu)使用示例
namedtuple顧名思義,就是名字+元組的數(shù)據(jù)結(jié)構(gòu),下面就來(lái)看一下Python的collections模塊中namedtuple結(jié)構(gòu)使用示例2016-07-07Django 過(guò)濾器匯總及自定義過(guò)濾器使用詳解
這篇文章主要介紹了Django 過(guò)濾器匯總及自定義過(guò)濾器使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07python使用Windows的wmic命令監(jiān)控文件運(yùn)行狀況,如有異常發(fā)送郵件報(bào)警
這篇文章主要介紹了python使用Windows的wmic命令監(jiān)控文件運(yùn)行狀況,如有異常發(fā)送郵件報(bào)警的示例,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2021-01-01python實(shí)現(xiàn)遍歷文件夾修改文件后綴
這篇文章主要介紹了python實(shí)現(xiàn)遍歷文件夾修改文件后綴,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08Python reduce()函數(shù)的用法小結(jié)
reduce()函數(shù)即為化簡(jiǎn)函數(shù),它的執(zhí)行過(guò)程為:每一次迭代,都將上一次的迭代結(jié)果,需要的朋友可以參考下2017-11-11分享一個(gè)簡(jiǎn)單的python讀寫(xiě)文件腳本
這篇文章主要介紹了分享一個(gè)簡(jiǎn)單的python讀寫(xiě)文件腳本,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11