python設(shè)計(jì)模式之單例模式你了解多少
單例模式
概念
單例模式:“保證一個(gè)類(lèi)僅有一個(gè)實(shí)例,并提供一個(gè)訪(fǎng)問(wèn)它的在這里插入代碼片全局訪(fǎng)問(wèn)點(diǎn)。 單例模式會(huì)阻止其他對(duì)象實(shí)例化其自己的單例對(duì)象的副本,從而確保所有對(duì)象都訪(fǎng)問(wèn)唯一實(shí)例。 單例模式應(yīng)用的場(chǎng)景一般發(fā)現(xiàn)在以下條件下: (1)資源共享的情況下,避免由于資源操作時(shí)導(dǎo)致的性能或損耗等。如上述中的日志文件,應(yīng)用配置。 (2)控制資源的情況下,方便資源之間的互相通信。如線(xiàn)程池等。
單例模式使用場(chǎng)景
- Web應(yīng)用的配置對(duì)象的讀取 - Windows的Task Manager(任務(wù)管理器) - 網(wǎng)站的計(jì)數(shù)器,一般也是采用單例模式實(shí)現(xiàn),否則難以同步 - 應(yīng)用程序的日志應(yīng)用,一般都何用單例模式實(shí)現(xiàn),這一般是由于共享的日志文件一直處于打開(kāi)狀態(tài),因?yàn)橹荒苡幸粋€(gè)實(shí)例去操作,否則內(nèi)容不好追加 - 數(shù)據(jù)庫(kù)連接池的設(shè)計(jì)一般也是采用單例模式,因?yàn)閿?shù)據(jù)庫(kù)連接是一種數(shù)據(jù)庫(kù)資源 - 多線(xiàn)程的線(xiàn)程池的設(shè)計(jì)一般也是采用單例模式,這是由于線(xiàn)程池要方便對(duì)池中的線(xiàn)程進(jìn)行控制。 -
python實(shí)現(xiàn)單例模式
函數(shù)裝飾器實(shí)現(xiàn)單例
def singleton(class_): instances = {) def get_instance(*args, **kwargs): if class_ not in instances: instances[class_] = class_(*argx, **kwargs) return instances[class_] reyurn get_instance @singleton class Cls(object): def __init__(self): pass cls1 = Cls() cls2 = Cls() print(id(cls1) == id(cls2))
輸出結(jié)果:
True
instances = {)
使用不可變的類(lèi)地址作為鍵,其實(shí)例作為值,每次創(chuàng)造實(shí)例時(shí),首先查看該類(lèi)是否存在實(shí)例,存在的話(huà)直接返回該實(shí)例即可,否則新建一個(gè)實(shí)例并存放在字典中。
使用模塊 (常用)實(shí)現(xiàn)單例
作為python的模塊是天然的單例模式
# mysingleton.py class My_Singleton(object): def foo(self): pass my_singleton = My_Singleton() # to use from mysingleton import my_singleton my_singleton.foo()
基于__new__實(shí)現(xiàn)的單例模式(最常用)
類(lèi)(class)通過(guò)方法 new 創(chuàng)造了實(shí)例(instance)
class Single(object): _instance = None def __new__(cls, *args, **kw): if cls._instance is None: orig = super(Single, cls) cls._instance = orig.__new__(cls, *args, **kw) return cls._instance def __init__(self): pass single1 = Single() single2 = Single() print(id(single1) == id(single2))
如果 _instance 為 None,則新建實(shí)例,否則直接返回 _instance 存放的實(shí)例。
使用 metaclass 實(shí)現(xiàn)單例模式
元類(lèi)(metaclass) 可以通過(guò)方法 metaclass 創(chuàng)造了類(lèi)(class)
class Singleton(type): _instances = {} def __call__(cls, *args, **kwargs): if cls not in cls._instances: cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs) return cls._instances[cls] class Cls4(metaclass=Singleton): pass cls1 = Cls4() cls2 = Cls4() print(id(cls1) == id(cls2))
我們將 metaclass 指向 Singleton 類(lèi),讓 Singleton 中的 type 來(lái)創(chuàng)造新的 Cls4 實(shí)例
web應(yīng)用配置文件單例實(shí)現(xiàn)
def singleton(class_): instances = {} def getinstance(*args, **kwargs): if class_ not in instances: instances[class_] = class_(*args, **kwargs) return instances[class_] return getinstance @singleton class Config(dict): """ 配置文件類(lèi) 單例模式 """ def __init__(self): self.__can_import = True self.__init_default() dict.__init__(self) def __init_default(self): self['debug'] = False self['autoreload'] = True @property def can_import(self): return self.__can_import def import_dict(self, **kwargs): if self.__can_import: for k, v in kwargs.items(): self[k] = v self.__can_import = False else: raise Exception('ConfigImportError') def clear(self): self.__can_import = True dict.clear(self) self.__init_default()
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
- Python的四種單例模式實(shí)現(xiàn)方式
- Python實(shí)現(xiàn)單例模式的四種方法
- Python 中單例模式的實(shí)現(xiàn)方法
- Python實(shí)現(xiàn)單例模式的五種寫(xiě)法總結(jié)
- Python?reflect單例模式反射各個(gè)函數(shù)
- Python實(shí)現(xiàn)單例模式的四種方式詳解
- Python中的單例模式與反射機(jī)制詳解
- Python實(shí)現(xiàn)單例模式的5種方法
- python單例模式的應(yīng)用場(chǎng)景實(shí)例講解
- Python單例模式的5種實(shí)現(xiàn)方式
相關(guān)文章
Python 解決logging功能使用過(guò)程中遇到的一個(gè)問(wèn)題
這篇文章主要介紹了Python 解決logging功能使用過(guò)程中遇到的一個(gè)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04python中關(guān)于os.path.pardir的一些坑
這篇文章主要介紹了python中關(guān)于os.path.pardir的一些坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09Python控制多進(jìn)程與多線(xiàn)程并發(fā)數(shù)總結(jié)
本篇文章主要介紹了Python控制多進(jìn)程與多線(xiàn)程并發(fā)數(shù),詳細(xì)講訴了進(jìn)程和線(xiàn)程的區(qū)別,并介紹了處理方法,有需要的朋友可以了解一下。2016-10-10python使用pandas處理大數(shù)據(jù)節(jié)省內(nèi)存技巧(推薦)
這篇文章主要介紹了python使用pandas處理大數(shù)據(jù)節(jié)省內(nèi)存技巧,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05Python numpy線(xiàn)性代數(shù)用法實(shí)例解析
這篇文章主要介紹了Python numpy線(xiàn)性代數(shù)用法實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11