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

你會發(fā)現兩個對象的id一樣 這也就說明兩個對象指向的內存地址就一樣,這個就是單例對象
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Python的collections模塊中namedtuple結構使用示例
namedtuple顧名思義,就是名字+元組的數據結構,下面就來看一下Python的collections模塊中namedtuple結構使用示例2016-07-07
python使用Windows的wmic命令監(jiān)控文件運行狀況,如有異常發(fā)送郵件報警
這篇文章主要介紹了python使用Windows的wmic命令監(jiān)控文件運行狀況,如有異常發(fā)送郵件報警的示例,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2021-01-01

