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

Python單例模式的四種創(chuàng)建方式實例解析

 更新時間:2020年03月04日 13:31:45   投稿:yaominghui  
這篇文章主要介紹了Python單例模式的四種創(chuàng)建方式實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

單例模式

單例模式(Singleton Pattern)是一種常用的軟件設(shè)計模式,該模式的主要目的是確保某一個類只有一個實例存在。當你希望在整個系統(tǒng)中,某個類只能出現(xiàn)一個實例時,單例對象就能派上用場。

比如,某個服務器程序的配置信息存放在一個文件中,客戶端通過一個 AppConfig 的類來讀取配置文件的信息。如果在程序運行期間,有很多地方都需要使用配置文件的內(nèi)容,也就是說,很多地方都需要創(chuàng)建 AppConfig 對象的實例,這就導致系統(tǒng)中存在多個 AppConfig 的實例對象,而這樣會嚴重浪費內(nèi)存資源,尤其是在配置文件內(nèi)容很多的情況下。事實上,類似 AppConfig 這樣的類,我們希望在程序運行期間只存在一個實例對象。

在 Python 中,我們可以用多種方法來實現(xiàn)單例模式:

  • 使用模塊
  • 使用__new__使
  • 用裝飾器(decorator)
  • 使用元類(metaclass)

使用模塊

其實,Python 的模塊就是天然的單例模式,因為模塊在第一次導入時,會生成.pyc文件,當?shù)诙螌霑r,就會直接加載.pyc文件,而不會再次執(zhí)行模塊代碼。因此,我們只需把相關(guān)的函數(shù)和數(shù)據(jù)定義在一個模塊中,就可以獲得一個單例對象了。如果我們真的想要一個單例類,可以考慮這樣做:

將上面的代碼保存在文件mysingleton.py中,然后這樣使用:

使用__new__

為了使類只能出現(xiàn)一個實例,我們可以使用__new__來控制實例的創(chuàng)建過程,代碼如下:

在上面的代碼中,我們將類的實例和一個類變量_instance關(guān)聯(lián)起來,如果cls._instance為 None 則創(chuàng)建實例,否則直接返回cls._instance。

執(zhí)行情況如下:

使用裝飾器

我們知道,裝飾器(decorator)可以動態(tài)地修改一個類或函數(shù)的功能。這里,我們也可以使用裝飾器來裝飾某個類,使其只能生成一個實例,代碼如下:

在上面,我們定義了一個裝飾器singleton,它返回了一個內(nèi)部函數(shù)getinstance,該函數(shù)會判斷某個類是否在字典instances中,如果不存在,則會將cls作為 key,cls(*args, **kw)作為 value 存到instances中,否則,直接返回instances[cls]。

使用 metaclass

元類(metaclass)可以控制類的創(chuàng)建過程,它主要做三件事:

攔截類的創(chuàng)建修改類的定義返回修改后的類

使用元類實現(xiàn)單例模式的代碼如下:

小結(jié)Python 的模塊是天然的單例模式,這在大部分情況下應該是夠用的,當然,我們也可以使用裝飾器、元類等方法

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • python3排序的實例方法

    python3排序的實例方法

    在本篇文章里小編給大家整理的是一篇關(guān)于python3排序的實例方法,有興趣的朋友們可以學習參考下。
    2020-10-10
  • 人工智能—Python實現(xiàn)線性回歸

    人工智能—Python實現(xiàn)線性回歸

    這篇文章主要介紹了人工智能—Python實現(xiàn)線性回歸,人工智能分為類型、數(shù)據(jù)集、效果評估、等,線性回歸根據(jù)隨機初始化的?w?x?b?和?y?來計算?loss等步驟實現(xiàn),下面來看看文章的具體實現(xiàn)吧
    2022-01-01
  • Django中數(shù)據(jù)在前后端傳遞的方式之表單、JSON與ajax

    Django中數(shù)據(jù)在前后端傳遞的方式之表單、JSON與ajax

    Django從后臺往前臺傳遞數(shù)據(jù)時有多種方法可以實現(xiàn),下面這篇文章主要給大家介紹了關(guān)于Django中數(shù)據(jù)在前后端傳遞的方式之表單、JSON與ajax的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • 自定義Django_rest_framework_jwt登陸錯誤返回的解決

    自定義Django_rest_framework_jwt登陸錯誤返回的解決

    這篇文章主要介紹了自定義Django_rest_framework_jwt登陸錯誤返回的解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • Matplotlib animation模塊實現(xiàn)動態(tài)圖

    Matplotlib animation模塊實現(xiàn)動態(tài)圖

    這篇文章主要介紹了Matplotlib animation模塊實現(xiàn)動態(tài)圖,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • pycharm查看變量值的4種方法匯總

    pycharm查看變量值的4種方法匯總

    因為Python是腳本語言,不會進行編譯,所以只有執(zhí)行到那一行,才能知道那個變量的類型,下面這篇文章主要給大家介紹了關(guān)于pycharm查看變量值的4種方法,需要的朋友可以參考下
    2022-04-04
  • PyCharm永久激活方式(推薦)

    PyCharm永久激活方式(推薦)

    這篇文章主要介紹了PyCharm永久激活方式,本文通過圖文并茂的方式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • opencv python圖像梯度實例詳解

    opencv python圖像梯度實例詳解

    這篇文章主要介紹了opencv python圖像梯度實例詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • Python反射機制實例講解

    Python反射機制實例講解

    本文主要介紹了Python反射機制實例,文中運用了大量的代碼講解Python反射機制,感興趣的小伙伴一定不要錯過這篇文章,可以參考參考
    2021-08-08
  • Python爬蟲之urllib基礎(chǔ)用法教程

    Python爬蟲之urllib基礎(chǔ)用法教程

    這篇文章主要為大家詳細介紹了Python爬蟲1.1 urllib基礎(chǔ)用法教程,用于對Python爬蟲技術(shù)進行系列文檔講解,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10

最新評論