您好,登錄后才能下訂單哦!
這篇“python實(shí)現(xiàn)單例的方法有哪些”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來(lái)看看這篇“python實(shí)現(xiàn)單例的方法有哪些”文章吧。
New 是真正創(chuàng)建實(shí)例對(duì)象的方法,所以重寫(xiě)基類(lèi)的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)
單例模式(Singleton Pattern)是一種常用的軟件設(shè)計(jì)模式,該模式的主要目的是確保某 一個(gè)類(lèi)只有一個(gè)實(shí)例存在。
當(dāng)你希望在整個(gè)系統(tǒng)中,某個(gè)類(lèi)只能出現(xiàn)一個(gè)實(shí)例時(shí),單例對(duì)象 就能派上用場(chǎng)。
比如,某個(gè)服務(wù)器程序的配置信息存放在一個(gè)文件中,客戶端通過(guò)一個(gè) AppConfig 的類(lèi)來(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í)上,類(lèi)似 AppConfig 這樣的類(lèi),我們希望在程序運(yùn)行期間只存在一個(gè)實(shí)例對(duì)象。 注意:在python中導(dǎo)入模塊就是一種單例模式
簡(jiǎn)單來(lái)說(shuō)單列模式就是創(chuàng)建單列對(duì)象,重寫(xiě)object類(lèi)里面的__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ì)象
以上就是關(guān)于“python實(shí)現(xiàn)單例的方法有哪些”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。