欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python設(shè)計(jì)模式之單例模式你了解多少

 更新時(shí)間:2022年03月04日 10:55:30   作者:托塔天王李  
這篇文章主要為大家詳細(xì)介紹了python設(shè)計(jì)模式之單例模式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助

單例模式

概念

單例模式:“保證一個(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)容!      

相關(guān)文章

  • Python 解決logging功能使用過(guò)程中遇到的一個(gè)問(wèn)題

    Python 解決logging功能使用過(guò)程中遇到的一個(gè)問(wèn)題

    這篇文章主要介紹了Python 解決logging功能使用過(guò)程中遇到的一個(gè)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • python如何將繪制的圖片保存為矢量圖格式(svg)

    python如何將繪制的圖片保存為矢量圖格式(svg)

    這篇文章主要介紹了python如何將繪制的圖片保存為矢量圖格式(svg)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • python中關(guān)于os.path.pardir的一些坑

    python中關(guān)于os.path.pardir的一些坑

    這篇文章主要介紹了python中關(guān)于os.path.pardir的一些坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • Python批量修改文件名,文件再多也只要一秒

    Python批量修改文件名,文件再多也只要一秒

    大家好,本篇文章主要講的是Python批量修改文件名,文件再多也只要一秒,感興趣的同學(xué)趕快來(lái)看一看,對(duì)你有幫助的話(huà)記得收藏一下,方便下次瀏覽
    2021-12-12
  • 使用OpenCV實(shí)現(xiàn)逐幀獲取視頻圖片

    使用OpenCV實(shí)現(xiàn)逐幀獲取視頻圖片

    這篇文章主要為大家詳細(xì)介紹了如何使用OpenCV實(shí)現(xiàn)逐幀獲取視頻中的圖片用來(lái)標(biāo)注,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • Python中常用的十個(gè)函數(shù)介紹

    Python中常用的十個(gè)函數(shù)介紹

    這篇文章主要介紹了Python中常用的十個(gè)函數(shù),shutil 是 Python 中的高級(jí)文件操作模塊,與os模塊形成互補(bǔ)的關(guān)系,需要的朋友可以參考下
    2023-04-04
  • Python控制多進(jìn)程與多線(xiàn)程并發(fā)數(shù)總結(jié)

    Python控制多進(jìn)程與多線(xiàn)程并發(fā)數(shù)總結(jié)

    本篇文章主要介紹了Python控制多進(jìn)程與多線(xiàn)程并發(fā)數(shù),詳細(xì)講訴了進(jìn)程和線(xiàn)程的區(qū)別,并介紹了處理方法,有需要的朋友可以了解一下。
    2016-10-10
  • python使用pandas處理大數(shù)據(jù)節(jié)省內(nèi)存技巧(推薦)

    python使用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-05
  • python中的常量和變量代碼詳解

    python中的常量和變量代碼詳解

    這篇文章主要介紹了python中的常量和變量,通過(guò)實(shí)例代碼給大家介紹了局部和全局變量,需要的朋友參考下吧
    2018-07-07
  • Python numpy線(xiàn)性代數(shù)用法實(shí)例解析

    Python numpy線(xiàn)性代數(shù)用法實(shí)例解析

    這篇文章主要介紹了Python numpy線(xiàn)性代數(shù)用法實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11

最新評(píng)論