99偷拍视频精品区一区二,口述久久久久久久久久久久,国产精品夫妇激情啪发布,成人永久免费网站在线观看,国产精品高清免费在线,青青草在线观看视频观看,久久久久久国产一区,天天婷婷久久18禁,日韩动漫av在线播放直播

Python中什么是單例模式-創(chuàng)新互聯(lián)

創(chuàng)新互聯(lián)www.cdcxhl.cn八線(xiàn)動(dòng)態(tài)BGP香港云服務(wù)器提供商,新人活動(dòng)買(mǎi)多久送多久,劃算不套路!

創(chuàng)新互聯(lián)主要從事成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)包頭,十年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專(zhuān)業(yè),歡迎來(lái)電咨詢(xún)建站服務(wù):18980820575

本篇文章為大家展示了Python中什么是單例模式,代碼簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

python單例模式

單例模式是一種常用的軟件設(shè)計(jì)模式,在單例模式的核心結(jié)構(gòu)中,只包含一個(gè)被稱(chēng)為單例類(lèi)的特殊類(lèi)。

通過(guò)單例模式可以保證系統(tǒng)中一個(gè)類(lèi)只有一個(gè)實(shí)例,而且這個(gè)實(shí)例可以輕易被外界訪(fǎng)問(wèn),方便控制實(shí)例對(duì)象的個(gè)數(shù)以節(jié)約系統(tǒng)資源。

單例模式是解決一個(gè)系統(tǒng)中某個(gè)類(lèi)的實(shí)例化對(duì)象有且只能有一個(gè)的最好解決方案。

單例模式的要點(diǎn)有三個(gè):

(1)某個(gè)類(lèi)只能有一個(gè)實(shí)例。

(2)這個(gè)類(lèi)必須自行創(chuàng)建其唯一實(shí)例。

(3)這個(gè)類(lèi)必須自行向整個(gè)系統(tǒng)提供這個(gè)唯一實(shí)例。

在python中,單例模式有三種實(shí)現(xiàn)方式:

方法一,使用__new__方法

先定義一個(gè)類(lèi),類(lèi)中定義__new__方法,然后將類(lèi)的一個(gè)實(shí)例類(lèi)綁定到類(lèi)變量中。

如果類(lèi)的_instance值為None,則說(shuō)明這個(gè)類(lèi)還沒(méi)有被實(shí)例化過(guò),程序會(huì)自動(dòng)實(shí)例化一個(gè)類(lèi)的實(shí)例,然后返回。

如果類(lèi)的_instance值不為None,則程序會(huì)直接返回_instance。

代碼如下:

class Singleton(object):
    _instance = None
    
    def __init__(self):
        pass
    
    def __new__(cls, *args, **kwargs):
    
        if not cls._instance:
            cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)  
        return cls._instance  
 
class MyClass(Singleton):  
    a = 1

在上面的代碼中,我們將類(lèi)的實(shí)例和一個(gè)類(lèi)變量 _instance關(guān)聯(lián)起來(lái)。

如果 cls._instance為 None 則創(chuàng)建實(shí)例,否則直接返回cls._instance。

用上來(lái)定義的類(lèi)實(shí)例化兩個(gè)對(duì)象:

cls1=MyClass()
cls2=MyClass()
print(id(cls1))
print(id(cls2))
print(cls1 == cls2)
print(cls1 is cls2)

得到的結(jié)果

43606480
43606480
True
True

方法二,使用decorator裝飾器

我們知道,裝飾器(decorator)可以動(dòng)態(tài)地修改一個(gè)類(lèi)或函數(shù)的功能。

在這里使用裝飾器來(lái)裝飾某個(gè)類(lèi),使其只能生成一個(gè)實(shí)例,代碼如下:

def singleton(cls):
    instances={}
    def getinstance(*args,**kwargs):
        if cls not in instances:
            instances[cls]=cls(*args,**kwargs)
        return instances[cls]
    return getinstance
@singleton
class MyClass(object):
    a=1

在上面,我們定義了一個(gè)裝飾器singleton,它返回了一個(gè)內(nèi)部函數(shù)getinstance,該函數(shù)會(huì)判斷某個(gè)類(lèi)是否在字典instances中,

如果不存在,則會(huì)將cls作為key,cls(*args, **kw)作為value存到instances中,否則,直接返回instances[cls]。

使用上面定義的類(lèi)實(shí)例化兩個(gè)對(duì)象,比較兩個(gè)對(duì)象

cls1=MyClass()
cls2=MyClass()
print(id(cls1))
print(id(cls2))
print(cls1 == cls2)
print(cls1 is cls2)

得到的結(jié)果為:

43672016
43672016
True
True

方法三,使用元類(lèi)(metaclass)

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

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

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

class Singleton(type):
        _inst = {}
    
        def __call__(self, *args, **kw):
            if self not in self._inst:
                self._inst[self] = super(Singleton, self).__call__(*args, **kw)
            return self._inst[self]
    
    class MyClass(metaclass=Singleton):
        def __init__(self):
            self.xx = 0
    cls1=MyClass()
    cls2=MyClass()
    print(id(cls1))
    print(id(cls2))
    print(cls1 == cls2)
    print(cls1 is cls2)

得到的結(jié)果為:

43477984
43477984
True
True

方法四,使用classmethod方法創(chuàng)建單例模式

class Foo:
    _instance = None
    def __init__(self):
        pass
    @classmethod
    def get_instance(cls):
        if cls._instance:
            return cls._instance
        else:
            obj=cls()
            cls._instance=obj
            return obj
cls1=Foo.get_instance()     # 實(shí)例化對(duì)象a1時(shí),沒(méi)有執(zhí)行Foo這個(gè)類(lèi)的__init__方法,直接執(zhí)行Foo類(lèi)的get_instance方法,
                                  在這里cls代指的是Foo類(lèi)。
                    # 前面把_instance賦值為None,所以直接執(zhí)行else中的語(yǔ)句,實(shí)例化一個(gè)obj對(duì)象,
                    然后把obj對(duì)象中的_instance方法賦值為obj對(duì)象本身,然后返回obj對(duì)象。
cls2=Foo.get_instance()   # 實(shí)例化a1時(shí),Foo類(lèi)中的_instance已經(jīng)被賦值為obj對(duì)象,所以再次執(zhí)行Foo中的get_instance方法時(shí),
                               是執(zhí)行if中的語(yǔ)句。
                    # 此時(shí)cls._instance就指的是obj對(duì)象,所以這里也返回obj這個(gè)對(duì)象。
print(id(cls1))
print(id(cls2))
print(cls1 == cls2)
print(cls1 is cls2)

這種方法由于在實(shí)例化對(duì)象時(shí)要調(diào)用類(lèi)中的get_instance方法,所以用的不多,知道即可。

特別聲明

Python的模塊是天然的單例模式,在一個(gè)py文件中,多次導(dǎo)入同一個(gè)模塊,這個(gè)模塊也只有在第一次的時(shí)候被導(dǎo)入,后續(xù)的該模塊導(dǎo)入語(yǔ)句都不會(huì)再執(zhí)行了。

上述內(nèi)容就是Python中什么是單例模式,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道。

文章題目:Python中什么是單例模式-創(chuàng)新互聯(lián)
標(biāo)題路徑:http://www.yijiale78.com/article28/pcccp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版企業(yè)網(wǎng)站制作全網(wǎng)營(yíng)銷(xiāo)推廣網(wǎng)站設(shè)計(jì)App設(shè)計(jì)Google

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司