python單例模式

来源:https://www.cnblogs.com/luyuze95/archive/2019/07/27/11257061.html
-Advertisement-
Play Games

關於python單例模式是什麼,以及一些實現方法的整理與講解。 ...


目錄

python 單例模式

1、什麼是單例模式

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

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

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

2、__new__方法實現

首先,我最推薦使用__new__方法來實現單例模式,因為我覺得這種方法是最容易理解的。我們知道__new__方法是類在實例化過程中調用的一個方法,該方法還要在__init__方法之前調用,用於創建類的實例化對象。那麼我們是不是可以重寫__new__ ,讓他判斷是否已經調用過該方法了,如果已經調用過了,直接返回上次實例化的對象,那麼該類不就一直只存在一個實例化對象了嗎,就實現了單例,例子如下。

class Singleton(object):
    def __new__(cls, *args, **kwargs):
        if not hasattr(cls, '_instance'):
            cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
        rerurn cls._instance

class A(Singleton):
    pass

# 類A即為單例類

3、裝飾器實現

我們可以寫一個裝飾器,來裝飾我們需要指定的單例類,這樣也可以實現。

def singleton(cls):
    instance = {}
    def wapper():
        if cls not in instance:
            instance[cls] = cls(*args, **kwargs)
        return instance[cls]
    return wapper

@singleton
class C:
    pass

# 類C即為單例類

4、模塊實現

我們知道,在python中,我們可以自己寫一個py文件,裡面的類或者方法就可以通過模塊導入。在python中,用模塊導入的類就是一個天然的單例。

# 作為Python模塊時是天然的單例模式

#創建一個sington.py文件,內容如下:
class Singleton(object):
    def foo(self):
        pass

mysington = Singleton()

# 運用
from sington import mysington

5、共用屬性實現

創建實例時把所有實例的__dict__指向同一個字典,這樣它們都具有相同的屬性和方法(類的__dict__存儲對象屬性)

class Singleton(object):
    _state = {}
    def __new__(cls, *args, **kwargs):
        ob = super(Singleton,cls).__new__(cls, *args, **kwargs)
        ob.__dict__ = cls._state
    return ob

class B(Singleton):
    pass

# 類B即為單例類

6、元類實現

最後一種方法使用元類實現單例模式,這種方法比較不容易理解,首先需要理解元類是什麼,這裡就不展開細講了,有興趣的同學可以自行學習元類的用法。

class Singleton(type):
    _instacne = {}
    def __call__(cls,*args,**kwargs):
        if cls not in cls._instance:
            cls._instances[cls] = super(Singleton, cls).__call__(*args,**kwargs)
            #以cls為key,cls(*args, **kwargs) 為值放入盛放單例的字典
        return cls._instance[cls]

class MyClass(metaclass=Singleton):
    pass
#MyClass即為單例類

好啦,單例模式的實現方法大致就是以上幾種了,大家可以學習學習。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 舉個慄子 問題描述 幾個同事上班期間看股市行情,讓前臺MM幫忙看著老闆什麼時候過來查崗,老闆進門的時候MM就撥電話給其中一個同事,於是所有同事都知道了,再繼續工作。。。 簡單實現 前臺秘書MM 看股票同事 測試 測試結果 存在問題 “前臺MM”和“看股票同事”互相耦合 如果還有人想看NBA直播,那隻 ...
  • 感謝原文出處:https://www.cnblogs.com/javazhiyin/ Spring 框架就像一個家族,有眾多衍生產品例如 boot、security、jpa等等。但他們的基礎都是Spring 的 ioc和 aop ioc 提供了依賴註入的容器 aop ,解決了面向橫切麵的編程,然後在 ...
  • 配置JMX遠程連接 1. 配置啟動參數 啟動jar時,添加如下配置 啟動參數說明 1. :配置一個遠程伺服器上未被占用的埠 2. :配置 JMX 是否啟用 ssl 3. :配置 JXM 是否啟動鑒權 4. :配置伺服器 IP 2. 配置 jvisualvm 添加遠程主機信息,填寫主機名,埠。埠 ...
  • 午休後,看看電視,在回顧下新的知識 函數。相信很多小伙伴在學習python後 ,學到函數就會有一部分人放棄了,從努力到放棄(內容過於真實) 好希望我也能有很多粉絲,hhh.... 函數: 什麼是函數?作用是什麼呢? 函數就是讓我們來偷懶的,沒錯,就是這樣簡單粗暴的解釋。。。 作用呢?就是我們定義的函 ...
  • 1.變數的輸入: input函數: input() input("請輸入銀行卡密碼") password = input("請輸入銀行卡密碼") 變數名 = input("XXX") # 用輸入函數給變數賦值 輸入函數給變數賦值舉例: 註:所有input()得到的數據類型都是str字元串類型 2.變 ...
  • 輸出函數是最常用的,對print()參數的準確認識尤為重要。 sep='':sep參數表示函數中不同value的分隔符,預設為一個空格。 end='':end參數表示函數結尾的處理,預設換行。 例如: ...
  • Swing的輸入框仍然分成兩類:單行輸入框和多行輸入框,但與AWT的同類控制項相比,它們在若幹細節上有所調整。首先說單行輸入框,AWT的單行輸入框名叫TextField,平時輸入什麼字元它便顯示什麼字元,可一旦調用了setEchoChar方法設置回顯字元,TextField馬上變成只顯示密文字元了。然 ...
  • 在使用Visual C++ 6.0打開文件時可能會出現下麵的情況 這可能是Vc6.0和win7相容性問題。 方法: 下載filetool即可 鏈接:https://pan.baidu.com/s/1Xmx0XI0Dy9uZGJEQW4cHQg 提取碼:drgz 下載之後,解壓到一個目錄,我這個是解壓 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...