python實現(xiàn)單例的兩種方法解讀
python 實現(xiàn)單例的方法
第一種方法:使用基類
New 是真正創(chuàng)建實例對象的方法,所以重寫基類的new 方法,以此保證創(chuàng)建對象的時候只生成一個實例
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)是一種常用的軟件設計模式,該模式的主要目的是確保某 一個類只有一個實例存在。
當你希望在整個系統(tǒng)中,某個類只能出現(xiàn)一個實例時,單例對象 就能派上用場。
比如,某個服務器程序的配置信息存放在一個文件中,客戶端通過一個 AppConfig 的類來 讀取配置文件的信息。
如果在程序運行期間,有很多地方都需要使用配置文件的內(nèi)容,也就 是說,很多地方都需要創(chuàng)建 AppConfig 對象的實例,這就導致系統(tǒng)中存在多個 AppConfig 的實例對象,而這樣會嚴重浪費內(nèi)存資源,尤其是在配置文件內(nèi)容很多的情況 下。
事實上,類似 AppConfig 這樣的類,我們希望在程序運行期間只存在一個實例對象。 注意:在python中導入模塊就是一種單例模式
簡單來說單列模式就是創(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))運行結(jié)果:

你會發(fā)現(xiàn)兩個對象的id一樣 這也就說明兩個對象指向的內(nèi)存地址就一樣,這個就是單例對象
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
一文教你用python編寫Dijkstra算法進行機器人路徑規(guī)劃
迪杰斯特拉(Dijkstra)算法是典型最短路徑算法,用于計算一個節(jié)點到其他節(jié)點的最短路徑,這篇文章主要給大家介紹了關(guān)于利用python編寫Dijkstra算法進行機器人路徑規(guī)劃的相關(guān)資料,需要的朋友可以參考下2021-08-08
Django Path轉(zhuǎn)換器自定義及正則代碼實例
這篇文章主要介紹了Django Path轉(zhuǎn)換器自定義及正則代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-05-05
Python實現(xiàn)基本線性數(shù)據(jù)結(jié)構(gòu)
這篇文章主要實現(xiàn)四種數(shù)據(jù)結(jié)構(gòu),分別是數(shù)組、堆棧、隊列、鏈表。大家都知道可以用C語言實現(xiàn)這幾種數(shù)據(jù)結(jié)構(gòu),其實Python也可以實現(xiàn),下面跟著小編一起來學習。2016-08-08
tensorflow2.0的函數(shù)簽名與圖結(jié)構(gòu)(推薦)
這篇文章主要介紹了tensorflow2.0的函數(shù)簽名與圖結(jié)構(gòu),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04

