<rp id="wnpn7"><ruby id="wnpn7"></ruby></rp>
<progress id="wnpn7"><track id="wnpn7"><rt id="wnpn7"></rt></track></progress>
<ruby id="wnpn7"></ruby>
<ruby id="wnpn7"><blockquote id="wnpn7"><div id="wnpn7"></div></blockquote></ruby>

    1. <em id="wnpn7"><ruby id="wnpn7"><input id="wnpn7"></input></ruby></em>
      1. <button id="wnpn7"><acronym id="wnpn7"></acronym></button><button id="wnpn7"><acronym id="wnpn7"></acronym></button>

        <rp id="wnpn7"><acronym id="wnpn7"></acronym></rp>

        <li id="wnpn7"><object id="wnpn7"><u id="wnpn7"></u></object></li>
        VB.net 2010 視頻教程 VB.net 2010 視頻教程 python基礎視頻教程
        SQL Server 2008 視頻教程 c#入門經典教程 Visual Basic從門到精通視頻教程
        當前位置:
        首頁 > 編程開發 > 簡明python教程 >
        • 簡明python教程之Python中的單例模式的幾種實現方式的及優化

        本站最新發布   Python從入門到精通|Python基礎教程
        試聽地址  
        http://www.squ68.com/eschool/python.html


        單例模式

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

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

        在 Python 中,我們可以用多種方法來實現單例模式

        實現單例模式的幾種方式

        1.使用模塊

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

        mysingleton.py

        將上面的代碼保存在文件mysingleton.py中,要使用時,直接在其他文件中導入此文件中的對象,這個對象即是單例模式的對象

        fromaimport singleton

        2.使用裝飾器

        3.使用類

        一般情況,大家以為這樣就完成了單例模式,但是這樣當使用多線程時會存在問題

        程序執行后,打印結果如下:

        看起來也沒有問題,那是因為執行速度過快,如果在init方法中有一些IO操作,就會發現問題了,下面我們通過time.sleep模擬

        我們在上面__init__方法中加入以下代碼:

         

        重新執行程序后,結果如下

         

        問題出現了!按照以上方式創建的單例,無法支持多線程

        解決辦法:加鎖!未加鎖部分并發執行,加鎖部分串行執行,速度降低,但是保證了數據安全

        打印結果如下:

         

        這樣就差不多了,但是還是有一點小問題,就是當程序執行時,執行了time.sleep(20)后,下面實例化對象時,此時已經是單例模式了,但我們還是加了鎖,這樣不太好,再進行一些優化,把intance方法,改成下面的這樣就行:

         

        這樣,一個可以支持多線程的單例模式就完成了

        這種方式實現的單例模式,使用時會有限制,以后實例化必須通過obj = Singleton.instance()

        如果用obj=Singleton() ,這種方式得到的不是單例

        4.基于__new__方法實現(推薦使用,方便)

        通過上面例子,我們可以知道,當我們實現單例時,為了保證線程安全需要在內部加入鎖

        我們知道,當我們實例化一個對象時,是先執行了類的__new__方法(我們沒寫時,默認調用object.__new__),實例化對象;然后再執行類的__init__方法,對這個對象進行初始化,所有我們可以基于這個,實現單例模式

        打印結果如下:

        采用這種方式的單例模式,以后實例化對象時,和平時實例化對象的方法一樣obj = Singleton()

        5.基于metaclass方式實現

        相關知識

        例子:

        元類的使用

        實現單例模式

        轉自:Python中的單例模式的幾種實現方式的及優化

        相關教程
                
        免费看成年人视频大全_免费看成年人视频在线观看