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

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

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

單例模式

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

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

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

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

使用模塊

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

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

使用__new__

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

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

執(zhí)行情況如下:

使用裝飾器

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

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

使用 metaclass

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

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

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

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

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

相關(guān)文章

  • python3排序的實(shí)例方法

    python3排序的實(shí)例方法

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

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

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

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

    Django從后臺往前臺傳遞數(shù)據(jù)時有多種方法可以實(shí)現(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登陸錯誤返回的解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Matplotlib animation模塊實(shí)現(xiàn)動態(tài)圖

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

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

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

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

    PyCharm永久激活方式(推薦)

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

    opencv python圖像梯度實(shí)例詳解

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

    Python反射機(jī)制實(shí)例講解

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

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

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

最新評論