python實(shí)現(xiàn)單例的兩種方法解讀
python 實(shí)現(xiàn)單例的方法
第一種方法:使用基類
New 是真正創(chuàng)建實(shí)例對象的方法,所以重寫基類的new 方法,以此保證創(chuàng)建對象的時候只生成一個實(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 單例對象
單列模式
單例模式(Singleton Pattern)是一種常用的軟件設(shè)計(jì)模式,該模式的主要目的是確保某 一個類只有一個實(shí)例存在。
當(dāng)你希望在整個系統(tǒng)中,某個類只能出現(xiàn)一個實(shí)例時,單例對象 就能派上用場。
比如,某個服務(wù)器程序的配置信息存放在一個文件中,客戶端通過一個 AppConfig 的類來 讀取配置文件的信息。
如果在程序運(yùn)行期間,有很多地方都需要使用配置文件的內(nèi)容,也就 是說,很多地方都需要創(chuàng)建 AppConfig 對象的實(shí)例,這就導(dǎo)致系統(tǒng)中存在多個 AppConfig 的實(shí)例對象,而這樣會嚴(yán)重浪費(fèi)內(nèi)存資源,尤其是在配置文件內(nèi)容很多的情況 下。
事實(shí)上,類似 AppConfig 這樣的類,我們希望在程序運(yùn)行期間只存在一個實(shí)例對象。 注意:在python中導(dǎo)入模塊就是一種單例模式
簡單來說單列模式就是創(chuàng)建單列對象,重寫object類里面的__new__方法使之開辟一個內(nèi)存空間,所有對象都指向同一內(nèi)存空間,使多個對象的引用地址相同
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é)果:
你會發(fā)現(xiàn)兩個對象的id一樣 這也就說明兩個對象指向的內(nèi)存地址就一樣,這個就是單例對象
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python的collections模塊中namedtuple結(jié)構(gòu)使用示例
namedtuple顧名思義,就是名字+元組的數(shù)據(jù)結(jié)構(gòu),下面就來看一下Python的collections模塊中namedtuple結(jié)構(gòu)使用示例2016-07-07python使用Windows的wmic命令監(jiān)控文件運(yùn)行狀況,如有異常發(fā)送郵件報警
這篇文章主要介紹了python使用Windows的wmic命令監(jiān)控文件運(yùn)行狀況,如有異常發(fā)送郵件報警的示例,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2021-01-01python實(shí)現(xiàn)遍歷文件夾修改文件后綴
這篇文章主要介紹了python實(shí)現(xiàn)遍歷文件夾修改文件后綴,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-08-08Python reduce()函數(shù)的用法小結(jié)
reduce()函數(shù)即為化簡函數(shù),它的執(zhí)行過程為:每一次迭代,都將上一次的迭代結(jié)果,需要的朋友可以參考下2017-11-11