Python單例模式魔法方法or屬性

1.單例模式

概念定義:

????????單例模式(Singleton Pattern)是一種創建型設計模式,它確保一個類只能有一個實例,并提供一個全局訪問點來獲取該實例。這種模式在需要控制資源訪問、配置管理或協調系統操作時特別有用。

核心特點:

  1. 私有構造函數:防止外部通過new創建實例
  2. 靜態私有成員變量:保存類的唯一實例
  3. 靜態公有方法:提供獲取實例的全局訪問點,通常命名為getInstance()

實現方式:

1.實例方法:

class Person(object):name = '三笠'         # 類屬性:類所擁有的屬性def __init__(self):self.age = 18       # 實例屬性:對象私有的def play(self):         # 實例方法# 在實例方法中訪問類屬性print(f'{Person.name}在玩游戲')print(self.age)
li = Person()
li.play()

2.靜態方法:

class Person(object):name = '三笠'         # 類屬性:類所擁有的屬性def __init__(self):self.age = 18       # 實例屬性:對象私有的@staticmethod       # 靜態方法:類中的函數,形參沒有限制def introduce():print(f'我是{Person.name}')   # 靜態方法能夠訪問到類屬性,但是沒意義pass
li = Person()
li.introduce()

3.類方法:

class Person(object):name = '三笠'         # 類屬性:類所擁有的屬性def __init__(self):self.age = 18       # 實例屬性:對象私有的@classmethod            # 類方法:針對類存在的方法def introduce(cls):     # cls代表類對象本身print(cls.name)print()
li = Person()
li.introduce()

優缺點分析:

優點:

  • 嚴格控制實例數量,節省系統資源
  • 提供全局訪問點,方便管理共享資源
  • 避免頻繁創建和銷毀對象,提高性能

缺點:

  • 違反單一職責原則,既負責業務邏輯又控制實例創建
  • 過度使用會導致代碼耦合度高
  • 難以進行單元測試,因為全局狀態難以隔離
  • 在多線程環境下需要特殊處理才能保證線程安全

總結:

????????類屬性是公共的,它被定義在類層面而非實例層面,所有類的實例都可以共享訪問這個屬性。例如,在一個Student類中定義class_name="高三一班"作為類屬性,那么所有Student的實例都能訪問到這個班級名稱。類屬性可以通過類名直接訪問(如Student.class_name),也可以通過實例訪問(如student1.class_name)。所有類的實例方法、靜態方法和類方法都能訪問到這個屬性。

????????靜態方法不需要訪問類屬性,因為靜態方法和類、對象沒有關聯,它更像是一個獨立于類的普通函數。靜態方法使用@staticmethod裝飾器定義,不會自動接收cls或self參數。例如,在MathUtils類中定義一個靜態方法add(a,b)來計算兩個數的和,這個方法不需要知道任何關于MathUtils類的信息就能正常工作。靜態方法通常用于實現與類相關但不需要訪問類狀態的功能。

????????實例屬性是私有的,它只能在特定實例的方法內部被訪問到。實例屬性通常在__init__方法中初始化,每個實例都擁有自己的屬性副本。例如,student1.name="張三"和student2.name="李四"就是兩個不同的實例屬性。只有實例方法(第一個參數為self的方法)能夠訪問這些屬性,因為這些方法需要通過self參數才能引用到具體的實例屬性。類方法和靜態方法都無法直接訪問實例屬性,因為它們沒有self參數來引用具體的實例。

2.魔法方法&魔法屬性

1.什么是魔法方法:

????????魔法方法(Magic Methods)是 Python 中一類特殊的方法,其名稱以雙下劃線開頭和結尾(如 __init____str__)。這些方法會在特定的情況下被 Python 自動調用,用于實現對象的特定行為或操作。

2.常見的魔法方法:

以下是一些常用的魔法方法及其用途:

  • __init__(self, ...):對象的初始化方法,在創建實例時自動調用。
  • __str__(self):定義對象的字符串表示形式,通常用于 print()str() 調用。
  • __repr__(self):定義對象的官方字符串表示形式,用于調試或 repr() 調用。
  • __len__(self):定義對象的長度,適用于 len() 調用。
  • __add__(self, other):定義對象的加法操作,如 obj1 + obj2
  • __eq__(self, other):定義對象的相等性比較,如 obj1 == obj2
  • __getitem__(self, key):定義對象的索引訪問,如 obj[key]
  • __setitem__(self, key, value):定義對象的索引賦值,如 obj[key] = value
  • __delitem__(self, key):定義對象的索引刪除,如 del obj[key]
  • __iter__(self):定義對象的迭代行為,用于 for 循環。
  • __next__(self):定義迭代器的下一個值。
  • __call__(self, ...):允許對象像函數一樣被調用,如 obj()
3. 魔法屬性的說明

????????魔法屬性(Magic Attributes)是 Python 中一些特殊的屬性,通常用于獲取對象的元信息或控制對象的行為。常見的魔法屬性包括:

  • __dict__:存儲對象的屬性字典。
  • __class__:返回對象所屬的類。
  • __doc__:獲取對象的文檔字符串(即 """...""" 的內容)。
  • __name__:獲取類或函數的名稱。
  • __module__:獲取對象所屬的模塊名稱。
4. 實際應用示例

以下是一個使用魔法方法的示例,定義一個簡單的自定義列表類:

class MyList:def __init__(self, data=None):if data is None:self.data = []else:self.data = list(data)def __str__(self):return f"MyList: {self.data}"def __len__(self):return len(self.data)def __getitem__(self, index):return self.data[index]def __setitem__(self, index, value):self.data[index] = valuedef __iter__(self):return iter(self.data)# 使用示例
my_list = MyList([1, 2, 3])
print(my_list)          # 輸出: MyList: [1, 2, 3]
print(len(my_list))     # 輸出: 3
print(my_list[1])       # 輸出: 2
my_list[1] = 99
print(my_list)          # 輸出: MyList: [1, 99, 3]for item in my_list:print(item)         # 輸出: 1, 99, 3

5. 魔法方法的注意事項
  • 魔法方法通常由 Python 解釋器自動調用,不建議直接調用(如 obj.__init__())。
  • 魔法方法可以重寫以定制對象的行為,但需確保不破壞其預期功能。
  • 合理使用魔法方法可以讓自定義類更自然地融入 Python 的生態系統。

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

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

相關文章

【Kubernetes系列】Kubernetes 資源請求(Requests)

博客目錄 引言一、資源請求的基本概念1.1 什么是資源請求1.2 請求與限制的區別 二、CPU 請求的深入解析2.1 CPU 請求的單位與含義2.2 CPU 請求的調度影響2.3 CPU 請求與限制的關系 三、內存請求的深入解析3.1 內存請求的單位與含義3.2 內存請求的調度影響3.3 內存請求的特殊性 …

大型語言模型中的自動化思維鏈提示

摘要 大型語言模型(LLMs)能夠通過生成中間推理步驟來執行復雜的推理任務。為提示演示提供這些步驟的過程被稱為思維鏈(CoT)提示。CoT提示有兩種主要范式。一種使用簡單的提示語,如“讓我們一步一步思考”,…

Private Set Generation with Discriminative Information(2211.04446v1)

1. 遇到什么問題,解決了什么遇到的問題現有差分隱私生成模型受限于高維數據分布建模的復雜性,合成樣本實用性不足。深度生成模型訓練依賴大量數據,加入隱私約束后更難優化,且不保證下游任務(如分類)的最優解…

C++編程語言入門指南

一、C語言概述 C是由丹麥計算機科學家Bjarne Stroustrup于1979年在貝爾實驗室開發的一種靜態類型、編譯式、通用型編程語言。最初被稱為"C with Classes"(帶類的C),1983年更名為C。它既具有高級語言的抽象特性,又保留了底層硬件操作能力&…

ZED相機與Foxglove集成:加速機器人視覺調試效率的實用方案

隨著機器人技術的發展,實時視覺數據流的高效傳輸和可視化成為提升系統性能的重要因素。通過ZED相機(包括ZED 2i和ZED X)與Foxglove Studio平臺的結合,開發者能夠輕松訪問高質量的2D圖像、深度圖和點云數據,從而顯著提高…

目標檢測新紀元:DETR到Mamba實戰解析

🚀【實戰分享】目標檢測的“后 DE?”時代:DETR/DINO/RT-DETR及新型骨干網絡探索(含示例代碼) 目標檢測從 YOLO、Faster R-CNN 到 Transformer 結構的 DETR,再到 DINO、RT-DETR,近兩年出現了許多新趨勢&am…

【IOS】XCode創建firstapp并運行(成為IOS開發者)

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 這篇文章主要介紹XCode創建firstapp并運行 學其所用,用其所學。——梁啟超 歡迎來到我的博客,一起學習,共同進步。 喜歡的朋友可以關注一下,下次更新不迷路…

class類和style內聯樣式的綁定 + 事件處理 + uniapp創建自定義頁面模板

目錄 一.class類的綁定 1.靜態編寫 2.動態編寫 二.style內聯樣式的綁定 三.事件處理 1.案例1 2.案例2 四.uniapp創建自定義頁面模板 1.為什么要這么做? 2.步驟 ①打開新建頁面的界面 ②在彈出的目錄下,新建模板文件 ③用HBuilderX打開該模板…

android 卡頓和丟幀區別

Android 卡頓(Jank)與丟幀(Frame Drop)的核心區別在于問題本質與用戶感知,以下是分層解析: ? 一、本質差異 維度卡頓(Jank)丟幀(Frame Drop)定義用戶可感知…

【python實用小腳本-125】基于 Python 的 Gmail 郵件發送工具:實現高效郵件自動化

引言 在現代辦公和開發環境中,郵件通信是一種重要的溝通方式。自動化發送郵件可以大大提高工作效率,例如發送通知、報告或文件。本文將介紹一個基于 Python 的 Gmail 郵件發送工具,它能夠通過 Gmail 的 SMTP 服務器發送郵件,并支持…

gateway斷言配置詳解

一、Predicate - 斷? 1、簡單用法 spring:cloud:gateway:routes:- id: after_routeuri: https://example.orgpredicates:- After2017-01-20T17:42:47.789-07:00[America/Denver] 2、自定義斷言 新建類VipRoutePredicateFactory,注意VipRoutePredicateFactory名字…

基于大模型的尿毒癥全流程預測與診療方案研究報告

目錄 一、引言 1.1 研究背景與意義 1.2 研究目的與方法 1.3 國內外研究現狀 二、尿毒癥相關理論基礎 2.1 尿毒癥的定義、病因與發病機制 2.2 尿毒癥的癥狀與診斷標準 2.3 尿毒癥的治療方法概述 三、大模型技術原理與應用 3.1 大模型的基本概念與發展歷程 3.2 大模型…

裸金屬服務器租用平臺-青蛙云

企業對服務器性能與靈活性的要求與日俱增。青蛙云M-啟強裸金屬服務器租用平臺應運而生,為企業提供了一種兼具物理機性能和云計算彈性的解決方案。裸金屬服務器租用平臺的優勢?(一)高配性能,無虛擬化開銷?裸金屬服務器直接運行在物理硬件之上&#xff0…

[Terence Tao訪談] AlphaProof系統 | AI嗅覺 | 研究生學習 | 龐加萊猜想(高維) | 復雜問題簡單化

玩這些有趣的東西。通常情況下什么也得不到,你必須學會說:“好吧,再試一次,什么都沒發生,我會繼續前進。” DeepMind的AlphaProof系統 Q:DeepMind的AlphaProof系統是通過強化學習訓練的,使用的…

Aseprite工具入門教程4之動畫導入Unity

1、時間軸功能 (1)眼睛圖標 顯示/隱藏圖層圖層隱藏時無法繪制 (2)鎖定圖標 鎖定后無法移動或編輯圖層防止意外在錯誤圖層上繪制 (3)單元格圖標 兩個點代表幀分開,一個橢圓代表幀統一。分開就…

移動硬盤頻繁提示格式化?解決異常故障的正確方法

移動硬盤作為數據存儲的重要工具,不少人都習慣將照片、文檔、項目資料甚至整臺電腦的備份都放在里面。但有時,一件令人頭疼的事悄然發生: 插上硬盤,系統卻突然提示:“使用驅動器中的光盤之前需要將其格式化。是否要將…

Java泛型筆記

1 為什么需要泛型 Java5之前,是沒有泛型的。通過兩段代碼我們就可以知道為何我們需要泛型 public int addInt(int a, int b) {return a b; }public double addDouble(double a, double b) {return a b; } 實際開發中,經常有數值類型求和的需求&…

mysql 圖形化界面工具 DataGrip 安裝與配置

安裝地址: Download DataGrip: Cross-Platform IDE for Databases & SQLhttps://www.jetbrains.com/datagrip/download/?sectionwindows 添加數據源: 下載驅動文件:直接點擊下載即可 點擊測試連接:成功后點擊確定 顯示所有數…

linux下進程之間socket通信c程序例程

以下是一個基于 Linux 的 C 程序示例,展示了如何使用 Unix 域套接字(Unix domain socket)在不同進程之間互傳 JSON 消息。我們將實現一個簡單的客戶端 - 服務器模型,服務器監聽連接,客戶端連接到服務器并發送 JSON 消息…

高云GW5AT-LV60 FPGA圖像處理板|MIPI攝像頭幀率測試

高云GW5AT-LV60 FPGA圖像處理板套件中附帶了三個攝像頭模組,這三個模組真是各有千秋,接下來我通過簡單的一些測試來看看這幾個攝像頭的差異。 VS-SC130GS 、 VS-SC2210 這兩個模組是手動對焦,在使用時需要手動轉動鏡頭調整焦距,這…