python 單例模式的四種實現方法

DAY 13. 單例設計

13.1 什么是單例設計

一個類每次實例化返回的都是同一個對象,這種設計模式叫做單例設計,這個類叫做單例類

13.2 實現單例設計的方法

13.2.1 重寫__new__()

class Foo:def __new__(cls,*args, **kwargs):# 如果是第一次實例化,返回一個新對象if not hasattr(cls, '_object'):cls._object = super().__new__(cls)return cls._objectdef __init__(self, name):self.name = namedef Print(self):print(f'The name of this object is: {self.name}')if __name__ == '__main__':foo1 = Foo('foo1')foo2 = Foo('foo2')foo3 = Foo('foo3')foo1.Print()  # The name of this object is: foo3foo2.Print()  # The name of this object is: foo3foo3.Print()  # The name of this object is: foo3

13.2.2 使用裝飾器

def singleton(cls):singleton_dict = {}def close(*args, **kwargs):# 利用字典的setdefault()方法,如果第一次實例化就加入字典,以后每次都返回這個對象return singleton_dict.setdefault('obj',cls(*args, **kwargs))return close@singleton
class MyClass:passif __name__ == '__main__':foo1 = MyClass()foo2 = MyClass()print(foo1)  # <__main__.MyClass object at 0x000001DF618C8940>print(foo2)  # <__main__.MyClass object at 0x000001DF618C8940>

13.2.3 使用模塊

用import導入的模塊就是天然的單例模式,如果想要實現一個單例類,不妨把它作為一個獨立的模塊,使用時導入由他實例化出來的對象

# mysingleton.py
class My_Singleton(object):def foo(self):passmy_singleton = My_Singleton()# to use
from mysingleton import my_singletonmy_singleton.foo()

13.2.4 共享屬性

共享屬性是指所有由“單例類”實例化出來的對象都共享“同一份屬性”,也就是所有對象的__dict__都指向同一個字典,但這樣嚴格來說并不算真的單例模式,因為這樣還是有多個實例對象,但其行為確實和單例模式一樣

class Foo:_mydict = {}def __new__(cls, *args, **kwargs):ob = super().__new__(cls)ob.__dict__ = cls._mydictreturn obif __name__ == '__main__':foo1 = Foo()foo2 = Foo()foo1.name = 'foo1'print(foo2.name)  # foo1# foo1 和 foo2 并不是同一個對象,只不過他們的方法和屬性公用同一塊內存print(foo1)  # <__main__.Foo object at 0x0000023ADA4A8A90>print(foo2)  # <__main__.Foo object at 0x0000023ADA4A8AC8>

13.3 總結

  • 什么是單例模式
    • 單例,即單個實例,一個類在實例化的過程中始終返回同一個實例
  • 實現單例模式的四種方法
    • 重寫__new__(cls)方法,該方法是一個類方法,用來為實例開辟內存空間,返回值是實例化對象,通過重寫該方法,可以使每次實例化都返回同一個對象
    • 修飾器方法:與之前修飾器那一節的斐波那契數列類似,判斷字典中有沒有對象,有的話就直接返回,沒有才實例化
    • 模塊:這是最簡單的方法,直接導入實例化對象
    • 共享屬性:通過把所有對象的__dict__指向同一塊內存空間來實現,雖然不是“一個實例”,但其行為與“一個實例”一樣

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

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

相關文章

Redis3.2.5部署(單節點)

1.安裝jdk1.8 [rootsht-logstash-01 ~]# cd /usr/java/ [rootsht-logstash-01 java]# wget --no-check-certificate --no-cookies --header "Cookie: oraclelicenseaccept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u111-b14/jdk-8u111…

字節跳動 設計模式 pdf_憑這份pdf我拿下了美團、字節跳動、阿里、小米等大廠的offer...

關于程序員&#xff0c;除了做項目來提高自身的技術之外&#xff0c;還有一種提升自己的專業技能就是&#xff1a;多&#xff01;看&#xff01;書&#xff01;小編整理出一篇Java進階架構師之路的核心知識&#xff0c;同時也是面試時面試官必問的知識點&#xff0c;篇章也是包…

B. One Bomb (#363 Div.2)

B. One Bombtime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutputstandard outputYou are given a description of a depot. It is a rectangular checkered field of n??m size. Each cell in a field can be empty (".") or…

力扣交替打印FooBar

這道題要注意的是兩個線程喚醒和等待的順序&#xff0c;應為第一個線程會比第二個線程更早結束&#xff0c;所以如果第一個線程已經結束&#xff0c;而第二個線程還在等待被喚醒&#xff0c;那第二個線程會一直等待下去&#xff0c;因此第一個線程要先等待后喚醒&#xff0c;這…

項目開發容易出錯情況統計

2016年11月17日 11:30:45 星期四 1.適配&#xff1a; a) APP彈窗大屏幕適配&#xff08;例如&#xff0c; 是否居中&#xff09; 2.按鈕狀態&#xff1a; a) 按鈕點擊后沒有disable 如果新頁面加載卡頓導致用戶多次點擊&#xff0c;生成多次請求 b) 按鈕disable后什么時候enabl…

python會不會出4_無極4網人生苦短,Python會不會被取代?國外網友

本文經AI新媒體量子位(公眾號ID:QbitAI)授權轉載&#xff0c;轉載請聯系出處。人生苦短&#xff0c;我該不該選擇Python&#xff1f;編程語言幾年一變樣&#xff0c;榜單之爭也是愈演愈烈&#xff0c;還架不住時不時殺出個黑馬……而對于Python&#xff0c;自2010年初以來一直蓬…

android 音頻播放總結 soundlPool,MediaPlay

soundlPool 用于小音頻的播放多個同時播放。 使用步驟&#xff1a; 步驟一&#xff1a; 首先下載音頻文件可以將其放入assets文件夾下或者res下的raw文件夾下&#xff0c;區別在于assets下可以再新建文件夾而raw不行&#xff0c;assets內部單個文件超過1m時可能存在bug而raw不會…

文本分析軟件_十大針對機器學習的文本注釋工具與服務,你選哪個?

房地產和鍵【51CTO.com快譯】目前&#xff0c;從搜索引擎與情感分析&#xff0c;到虛擬助手與聊天機器人&#xff0c;機器學習應用場景中的許多研究領域&#xff0c;都需要通過文本注釋工具與服務來提供準確性。在AI研究與開發行業中&#xff0c;發現或創建可注釋的數據對于項目…

sqlite創建表

create table bike (id varchar(6) primary key, password char(6));

python 垃圾回收機制

DAY 18. python垃圾回收機制 python GC主要有三種方式 引用計數標記清除分代回收 其中&#xff0c;以引用計數為主。 18.1 引用計數&#xff08;Reference Counting&#xff09; 《尋夢環游記》中說&#xff0c;人一生會經歷兩次死亡&#xff0c;一次是肉體死的時候&#…

曲線連接線_荷重位移曲線儀操作使用注意事項-荷重位移曲線儀廠家

荷重位移曲線儀廣泛適用于各種按鍵及開關、DOME片、按鍵、微力彈片、硅膠按鍵、汽車開關之荷重-行程測定&#xff1b;Windows中英文雙語軟件&#xff0c;操作簡單方便&#xff0c;軟件流暢穩定&#xff0c;所有測試資料(測試條件&#xff0c;曲線&#xff0c;數據結果&#xff…

進程調度

1、策略 策略決定調度程序在何時讓什么進程運行。調度器的策略往往決定系統的整體印象&#xff0c;并且&#xff0c;還要負責優化使用處理器時間。 1.1 I/o消耗型和處理器消耗型。 進程可以被分為I/O消耗型和處理器消耗型。前者指進程的大部分時間用來提交I/O請求或者等待I/O請…

Django,Ajax,Vue實現文章評論功能

Django評論 評論復雜的地方在于需要實現點擊提交評論后評論內容需要立刻出現在下面&#xff0c;還要保持頁面位置不變&#xff0c;所以提交后不能整體刷新頁面&#xff0c;因為刷新以后頁面肯定在最上面&#xff0c;而評論一般都在最下面&#xff0c;所以要用到Ajax 整個過程用…

回歸分析什么時候取對數_冬蜜什么時候取,冬天取蜂蜜的方法

大家好&#xff0c;我現在分享的是&#xff0c;在冬天是在什么時候取蜜&#xff01;冬天在我們南方&#xff0c;取蜜時間是十一月到十二月的時候&#xff0c;只要溫度達到15度以上&#xff0c;蜂蜜封蓋了就可以取蜜了&#xff0c;并且在冬天我們只能取一次&#xff0c;最晚取蜜…

Opencv與dlib聯合進行人臉關鍵點檢測與識別

前言 依賴庫&#xff1a;opencv 2.4.9 /dlib 19.0/libfacedetection 本篇不記錄如何配置&#xff0c;重點在實現上。使用libfacedetection實現人臉區域檢測&#xff0c;聯合dlib標記人臉特征點&#xff0c;最后使用opencv的FaceRecognizer實現人臉識別。 準備工作 1、配置好Op…

Category 的一些事

來源&#xff1a;伯樂在線 - Tsui YuenHong 鏈接&#xff1a;http://ios.jobbole.com/90422/ 點擊 → 申請加入伯樂在線專欄作者 新增實踐部分&#xff1a;偏方 Hook 進某些方法來添加功能 Category – 簡介 Category&#xff08;類別&#xff09;是 Objective-C 2.0 添加的新特…

python tfidf特征變換_機器學習的“萬能模板” - 數據分析

最后是文本變量。很遺憾Titanic數據集中沒有合適的文本變量。一般我們處理文本變量的方法是&#xff0c;合并所有的文本形成一個變量&#xff0c;然后調用Count Vectorizer或者TfidfVectorizer算法&#xff0c;將文本數據轉換成數字。大部分情況下&#xff0c;TfidfVectorizer比…

python實現哈希表

# python 實現哈希表class HashTable:"""哈希函數的構造解決沖突"""def __init__(self, source):self.source sourceself._index []self._val []self.table []self._mod 13def Output(self):print(self._index)print(self._val)def _create…

商品綜合評價排名

店內有很多產品&#xff0c;而且包含但不局限于以下指標&#xff1a;瀏覽量、訪客數、平均停留時長、詳情頁跳出率、下單轉化率、下單支付轉化率、支付轉化率、下單金額、下單商品件數、下單買家數、支付金額、支付商品件數、加購件數、訪客平均價值、收藏人數、客單價、搜索支…

ionic資源網站

http://ionichina.com/topic/570b1f4ecd63e4247a7cfcf3 http://doc.ionicmaterialdesign.com/#intro http://ionicmaterial.com/demo/ 10大materialhttp://www.open-open.com/news/view/192f93e轉載于:https://www.cnblogs.com/znsongshu/p/6079357.html