中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python中什么是單例模式

發布時間:2020-08-26 17:22:54 來源:億速云 閱讀:173 作者:Leah 欄目:編程語言

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

python單例模式

單例模式是一種常用的軟件設計模式,在單例模式的核心結構中,只包含一個被稱為單例類的特殊類。

通過單例模式可以保證系統中一個類只有一個實例,而且這個實例可以輕易被外界訪問,方便控制實例對象的個數以節約系統資源。

單例模式是解決一個系統中某個類的實例化對象有且只能有一個的最好解決方案。

單例模式的要點有三個:

(1)某個類只能有一個實例。

(2)這個類必須自行創建其唯一實例。

(3)這個類必須自行向整個系統提供這個唯一實例。

在python中,單例模式有三種實現方式:

方法一,使用__new__方法

先定義一個類,類中定義__new__方法,然后將類的一個實例類綁定到類變量中。

如果類的_instance值為None,則說明這個類還沒有被實例化過,程序會自動實例化一個類的實例,然后返回。

如果類的_instance值不為None,則程序會直接返回_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

在上面的代碼中,我們將類的實例和一個類變量 _instance關聯起來。

如果 cls._instance為 None 則創建實例,否則直接返回cls._instance。

用上來定義的類實例化兩個對象:

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

得到的結果

43606480
43606480
True
True

方法二,使用decorator裝飾器

我們知道,裝飾器(decorator)可以動態地修改一個類或函數的功能。

在這里使用裝飾器來裝飾某個類,使其只能生成一個實例,代碼如下:

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

在上面,我們定義了一個裝飾器singleton,它返回了一個內部函數getinstance,該函數會判斷某個類是否在字典instances中,

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

使用上面定義的類實例化兩個對象,比較兩個對象

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

得到的結果為:

43672016
43672016
True
True

方法三,使用元類(metaclass)

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

攔截類的創建
修改類的定義
返回修改后的類

用元類實現單例模式的代碼如下:

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)

得到的結果為:

43477984
43477984
True
True

方法四,使用classmethod方法創建單例模式

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()     # 實例化對象a1時,沒有執行Foo這個類的__init__方法,直接執行Foo類的get_instance方法,
                                  在這里cls代指的是Foo類。
                    # 前面把_instance賦值為None,所以直接執行else中的語句,實例化一個obj對象,
                    然后把obj對象中的_instance方法賦值為obj對象本身,然后返回obj對象。
cls2=Foo.get_instance()   # 實例化a1時,Foo類中的_instance已經被賦值為obj對象,所以再次執行Foo中的get_instance方法時,
                               是執行if中的語句。
                    # 此時cls._instance就指的是obj對象,所以這里也返回obj這個對象。
print(id(cls1))
print(id(cls2))
print(cls1 == cls2)
print(cls1 is cls2)

這種方法由于在實例化對象時要調用類中的get_instance方法,所以用的不多,知道即可。

特別聲明

Python的模塊是天然的單例模式,在一個py文件中,多次導入同一個模塊,這個模塊也只有在第一次的時候被導入,后續的該模塊導入語句都不會再執行了。

上述內容就是Python中什么是單例模式,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宝丰县| 竹溪县| 砚山县| 远安县| 灌云县| 平顺县| 应城市| 大连市| 米林县| 永吉县| 兴山县| 新源县| 公主岭市| 亚东县| 开江县| 沁水县| 南陵县| 苍梧县| 台北市| 阿克| 桃园市| 屯门区| 库尔勒市| 宁晋县| 麻阳| 张家川| 武清区| 乌海市| 宽甸| 班戈县| 江津市| 莲花县| 奎屯市| 类乌齐县| 陆河县| 平陆县| 施甸县| 微山县| 黄陵县| 克山县| 丰都县|