Python學習之——單例模式

Python學習之——單例模式

  • 參考
    • 1 利用__metaclass__實現單例
      • super的用法
      • class Singleton(type)元類
    • 2 重載__new__方法實現單例模式
    • 3 利用裝飾器實現單例
    • 考慮一個類如果繼承一個單例類的問題

參考

python之metaclass+singleton(一)
python之metaclass+singleton(二)
python之metaclass+singleton(三)

1 利用__metaclass__實現單例

揭開Python元類(metaclass)神秘的面紗

super的用法

【python】B站最細致的super()詳解,一定有你不知道的知識!
在這里插入圖片描述

super(arg1):
一個參數:
# 返回一個未bind的對象
ubo = super(Male)
# bind一個object
ubo.__get__(self).__init__(age, name)super(arg1,arg2):
兩個參數:
arg1:決定從MRO鏈中的arg1后開始
arg2:決定使用該super函數的對象object和對象的MRO,注意arg2也可以是class,但不常用

class Singleton(type)元類

singleton文件夾
在這里插入圖片描述

__ init__.py文件

# -*- coding: utf-8 -*-
"""單例."""class Singleton(type):def __init__(cls, name, bases, dict):super(Singleton, cls).__init__(name, bases, dict)cls.instance = Nonedef __call__(cls, *args, **kwargs):print 'call Singleton __call__'if cls.instance is None:# 等價于cls.instance = type.__call__(cls, *args, **kwargs)cls.instance = super(Singleton, cls).__call__(*args, **kwargs)return cls.instance

利用__metaclass__實現單例的示例

class Foo(object):__metaclass__ = Singletonfoo1 = Foo()
foo2 = Foo()
#運行結果應該為True, 但實際是False, 想想為啥會出現這樣的異常??
print foo1 is foo2  

請思考如下問題:

  1. 不用Foo類去創建實例,僅僅只有Foo和Singleton定義,執行腳本,會不會像第二節中打印出print語句?
    不會

  2. __call__在哪里調用?
    還記得__call__是怎么調用的嗎?是一個類實例化出來的對象obj,直接通過obj ()形式調用了 __ call __。
    此處的元類根本沒有復寫 __new __和 __init __方法,Foo類就是Singleton創建出來的一個普通的類(就是一個Singleton類的對象,實例),因此Foo()會調用Singleton的 __call __。
    __call__中限定了只能新建一個Foo類的對象。如果想要定義的類是單例的,只要定義類時指定__metaclass__ = Singleton即可。

  3. 繼承Foo類的也會是單例嗎?

class FooChild(Foo):def __init__(self, a):super(FooChild, self).__init__()
foo11 = FooChild()
foo22 = FooChild()
print foo11 is foo22  #運行結果為True

2 重載__new__方法實現單例模式

“雙重檢查鎖定”(Double-Checked Locking)單例模式

from threading import Lockclass SingletonClass(object):instance = Nonelock = Lock()def __new__(cls, *args, **kwargs):if cls.instance:return cls.instancewith cls.lock:# double checkif not cls.instance:cls.instance = super(SingletonClass, cls).__new__(cls, *args, **kwargs)return cls.instance# 測試
if __name__ == "__main__":s1 = SingletonClass()s2 = SingletonClass()print(s1 is s2)  # 應該輸出 True# 在多線程環境中測試import threadingdef test_singleton():instance = SingletonClass()print(f"Instance id in thread {threading.current_thread().name}: {id(instance)}")threads = [threading.Thread(target=test_singleton) for _ in range(5)]for t in threads:t.start()for t in threads:t.join()       

3 利用裝飾器實現單例

def singleton(cls):instances = {}def wrapper(*args, **kwargs):if cls not in instances:instances[cls] = cls(*args, **kwargs)return instances[cls]return wrapper@singleton
class Foo(object):passfoo1 = Foo()#等同于
#class Foo(object):
#    pass
#foo1 = singleton(Foo)
foo2 = Foo()
print foo1 is foo2  #運行結果為True

考慮一個類如果繼承一個單例類的問題

3 中繼承會出現問題

# 報錯function() argument 'code' must be code, not str
# 因為Foo被裝飾后成為了函數而不是class
# class FooChild(Foo):# 改成如下
ClassFoo = Foo().__class__class FooChild(ClassFoo):def __init__(self, a=0):super(FooChild, self).__init__()
但是這里的 FooChild就不在是單例了,也沒法在加上@singleton來實現單例了

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/87129.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/87129.shtml
英文地址,請注明出處:http://en.pswp.cn/web/87129.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Linux】U-boot常用命令總結

U-Boot 是嵌入式系統中常用的引導加載程序(bootloader),它提供了一套命令行接口,用于調試、加載操作系統鏡像以及進行硬件測試等操作。 1、變量操作命令 這些命令用于管理 U-Boot 的環境變量。 命令功能說明setenv name value設…

【Linux】不小心又創建了一個root權限賬戶,怎么將它刪除?!

一.前言 今天在學習linux提權的時候,把新建的一個普通賬戶權限提升成了root, 當我練習完提權,想要把這個賬戶刪掉的時候。 發現… 好家伙,這個根本刪不掉 隨后試了各種各樣的方法,都不行,后來突然想到是否…

數據結構:數組(Array)

目錄 什么是數組(Array)? 🔍為什么數組的下標要從 0 開始? 一、內存地址與偏移量的關系:從 0 開始是最自然的映射 二、指針的起點就是第 0 個元素的地址 三、歷史原因:BCPL → B → C → …

視頻內存太大怎么壓縮變小一點?視頻壓縮的常用方法

視頻傳生活或者工作中很常見,如發送視頻郵件、在線視頻播放、視頻上傳下載等。未壓縮的大內存視頻文件傳輸時,不僅會消耗大量的網絡帶寬資源,還會使傳輸時間大幅增加。在網速有限的情況下,發送一個幾 GB 的未壓縮視頻可能需要數小…

性能測試包括哪些方面?要掌握哪些知識

性能測試是軟件測試中的一個重要方面,它主要關注軟件在不同條件下的穩定性、可靠性和性能表現。性能測試包括多個方面,需要掌握的知識也相對廣泛。以下是對性能測試包括的方面以及需要掌握的知識分析: 一、性能測試包括的方面 響應時間&…

windows的vscode無法通過ssh連接ubuntu的解決辦法

現象: 最近在windows本地通過vscode登錄ssh時發現不得勁,總是報錯無法與”192.168.1.129“建立連接,如下圖: 但是這種報錯以及在輸出端的信息并沒有提供具體錯誤原因,于是換poweshell來登錄,報錯如下圖&am…

第2章,[標簽 Win32] :Windows 的字符串函數

專欄導航 上一篇:第2章 :兼容 ASCII 字符與寬字符的 Windows 函數調用 回到目錄 下一篇:無 本節前言 在下面的文章鏈接里面,我們談到過,使用兼容版的字符串處理函數的知識。 第2章 :編寫兼容多字節字…

Java的SpringAI+Deepseek大模型實戰-會話記憶【三】

文章目錄 背景項目環境實現步驟第一步、定義會話存儲方式方式一、定義記憶存儲ChatMemory方式二、注入記憶存儲ChatMemory 第二步、配置會話記憶方式一、老版本實現方式二、新版本實現 第三步、添加會話ID 異常處理1、InMemoryChatMemory 無法解析 背景 前兩期搭建起大模型對話…

Python3完全新手小白的學習手冊 10 文件和異常

文章目錄 讀取文件讀取文件的全部內容 相對路徑和絕對路徑訪問文件中的各行使用文件的內容包含100萬位的大型文件圓周率值中包含你的生日嗎? 寫入文件寫入一行寫入多行 異常處理ZeroDivisionError異常使用try-except代碼塊else代碼塊處理FileNotFoundError異常分析文…

VC Spyglass:工具簡介

相關閱讀 VC Spyglasshttps://blog.csdn.net/weixin_45791458/category_12828932.html?spm1001.2014.3001.5482 傳統上,基于仿真的動態驗證技術一直是功能驗證的核心方式。隨著現代SoC設計日益復雜,靜態驗證技術的引入變得愈發重要。 Synopsys的 VC Sp…

AWS RDS Aurora全局數據庫轉區域數據庫實戰指南:無縫遷移零停機

Aurora全局數據庫是AWS提供的跨區域高可用解決方案,但在某些場景下,我們需要將其轉換為普通區域數據庫。本文將詳細介紹這一轉換過程,并分享關鍵技術要點和實戰經驗。 一、全局數據庫與區域數據庫概述 AWS RDS Aurora全局數據庫是一種跨區域部署的數據庫架構,主要用于災備…

C++之路:函數重載與運算符重載

目錄 函數重載運算符重載C運算符重載范圍對照表注意事項 運算符重載語法全局運算符重載類內運算符重載下面以一個一元運算符為例,介紹特性1:下面介紹特性3:(必須類內重載的運算符?) 函數重載 函數重載是指同一個作用域…

七、SpringCloud 項目遷移至 K8s

七、SpringCloud 項目遷移至 K8s 文章目錄 七、SpringCloud 項目遷移至 K8s1、環境準備1.1 集群規劃1.2 SpringCloud 項目架構及遷移需求分析 2、遷移 Eureka 集群2.1 構建及容器化2.2 部署至 K8s2.3 創建通信Service 3、遷移網關服務3.1 構建及容器化3.2 部署至 K8s3.3 創建Se…

通過具有一致性嵌入的大語言模型實現端到端乳腺癌放射治療計劃制定|文獻速遞-最新論文分享

Title 題目 End-to-end breast cancer radiotherapy planning via LMMs with consistency embedding 通過具有一致性嵌入的大語言模型實現端到端乳腺癌放射治療計劃制定 01 文獻速遞介紹 近年來,受大型語言模型(LLM)啟發的新一代人工智…

MCP Chart Server服務本地部署案例

一、MCP Chart Server介紹 MCP Chart Server是一個專業的圖表生成服務,支持多種圖表類型,適用于數據可視化和分析。 MCP Chart Server是一種用于生成和呈現圖表的服務器端軟件。它提供了一個簡單而強大的方式,讓開發人員和系統管理員可以輕…

復合型浪涌保護器五大核心技術重構電氣防護體系

開篇:從傳統防護到智能守護的技術跨越 在電氣設備面臨浪涌威脅的防護場景中,浪涌保護器(SPD)始終扮演著關鍵角色。面對傳統SPD在漏電流、續流等方面的技術局限,行業領先企業通過技術整合開發出復合型SPD,以…

c# 詳細分析Task.sleep和Thread.sleep 的區別、使用場景和應用示例

文章目錄 Task.Delay vs Thread.Sleep 詳細分析與使用場景核心區別詳細分析Thread.SleepTask.Delay 性能考量綜合示例高級用法組合延遲與超時實現指數退避重試 總結建議 Task.Delay vs Thread.Sleep 詳細分析與使用場景 核心區別 Task.Delay 和 Thread.Sleep 都用于在代碼中引…

Vue 3 中的 `h` 函數詳解

h 函數是 Vue 3 中用于創建**虛擬 DOM 節點(VNode)**的核心函數,它是 Vue 渲染系統的基石。下面我將全面解釋它的作用、用法和重要性。 1. h 函數的基本概念 h 是 createVNode 的簡稱,來源于"hyperscript"的縮寫傳統。它的主要作用是&#x…

SoapCore 全面介紹:在 .NET Core 中實現 SOAP 服務的現代解決方案

一、什么是 SoapCore? 在現代微服務和 REST API 成為主流的今天,SOAP(Simple Object Access Protocol)看似已經被邊緣化,但在許多企業和政務系統中,SOAP 仍然是 重要的通信協議。特別是在金融、保險、醫療…

JDBC工具類和SQL 注入問題

在軟件開發中,數據庫安全與高效訪問一直是關鍵課題。本文將圍繞 SQL 注入問題的原理、解決方案,以及 JDBC 開發中的工具類演進和連接池技術展開探討,結合實際代碼示例,為開發者提供清晰的技術實踐指南。 SQL 注入問題的核心原理與…