久久r热视频,国产午夜精品一区二区三区视频,亚洲精品自拍偷拍,欧美日韩精品二区

您的位置:首頁技術(shù)文章
文章詳情頁

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

瀏覽:49日期:2022-08-04 11:22:13

單例模式

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

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

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

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

使用模塊

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

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

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

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

使用__new__

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

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

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

執(zhí)行情況如下:

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

使用裝飾器

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

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

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

使用 metaclass

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

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

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

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

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

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

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 宜章县| 高淳县| 乡城县| 河池市| 陇南市| 连南| 东宁县| 二连浩特市| 如皋市| 新余市| 松桃| 镇坪县| 华容县| 兰溪市| 汉阴县| 定远县| 临潭县| 上蔡县| 嘉峪关市| 沈阳市| 紫金县| 太保市| 黑龙江省| 汝州市| 纳雍县| 泾川县| 睢宁县| 德惠市| 电白县| 合江县| 阳春市| 元阳县| 富民县| 巴青县| 仙桃市| 七台河市| 左权县| 额尔古纳市| 尚义县| 克拉玛依市| 娱乐|