python實(shí)現(xiàn)單例的兩種方法解讀
python 實(shí)現(xiàn)單例的方法
第一種方法:使用基類
New 是真正創(chuàng)建實(shí)例對(duì)象的方法,所以重寫基類的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è)文件中,客戶端通過一個(gè) AppConfig 的類來 讀取配置文件的信息。
如果在程序運(yùn)行期間,有很多地方都需要使用配置文件的內(nèi)容,也就 是說,很多地方都需要?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)單來說單列模式就是創(chuàng)建單列對(duì)象,重寫object類里面的__new__方法使之開辟一個(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一樣 這也就說明兩個(gè)對(duì)象指向的內(nèi)存地址就一樣,這個(gè)就是單例對(duì)象
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
一文教你用python編寫Dijkstra算法進(jìn)行機(jī)器人路徑規(guī)劃
迪杰斯特拉(Dijkstra)算法是典型最短路徑算法,用于計(jì)算一個(gè)節(jié)點(diǎn)到其他節(jié)點(diǎn)的最短路徑,這篇文章主要給大家介紹了關(guān)于利用python編寫Dijkstra算法進(jìn)行機(jī)器人路徑規(guī)劃的相關(guān)資料,需要的朋友可以參考下2021-08-08
利用Python實(shí)現(xiàn)添加或讀取Excel公式
Excel公式是數(shù)據(jù)處理的核心工具,從簡(jiǎn)單的加減運(yùn)算到復(fù)雜的邏輯判斷,掌握基礎(chǔ)語法是高效工作的起點(diǎn),下面我們就來看看如何使用Python進(jìn)行Excel公式的添加與讀取吧2025-03-03
Django Path轉(zhuǎn)換器自定義及正則代碼實(shí)例
這篇文章主要介紹了Django Path轉(zhuǎn)換器自定義及正則代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
Python實(shí)現(xiàn)基本線性數(shù)據(jù)結(jié)構(gòu)
這篇文章主要實(shí)現(xiàn)四種數(shù)據(jù)結(jié)構(gòu),分別是數(shù)組、堆棧、隊(duì)列、鏈表。大家都知道可以用C語言實(shí)現(xiàn)這幾種數(shù)據(jù)結(jié)構(gòu),其實(shí)Python也可以實(shí)現(xiàn),下面跟著小編一起來學(xué)習(xí)。2016-08-08
tensorflow2.0的函數(shù)簽名與圖結(jié)構(gòu)(推薦)
這篇文章主要介紹了tensorflow2.0的函數(shù)簽名與圖結(jié)構(gòu),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04

