什麼是python單例模式,看完你就知道了

2020-12-09 程式設計師亮哥

1、什麼是單例模式

讓所有類在實例化時,指向同一個內存地址,稱之為單例模式 PS:無論產生多少個對象,都會指向 單個 實例

當在確定 "類中的屬性與方法不變" 需要反覆調用類時,會產生不同的對象,也會產生不同的內存地址,最終造成資源的浪費,如下例:

class Foo: def __init__(self, x, y): self.x = x self.y = yfoo_obj1 = Foo(10, 20)print(foo_obj1.__dict__)print(foo_obj1)foo_obj2 = Foo(10, 20)print(foo_obj2.__dict__)print(foo_obj2)

class Foo: def __init__(self, x, y): self.x = x self.y = yfoo_obj1 = Foo(10, 20)print(foo_obj1.__dict__)print(foo_obj1)foo_obj2 = Foo(10, 20)print(foo_obj2.__dict__)print(foo_obj2)  執行結果:

# foo_obj1和foo_obj2調用的屬性相同,但內存地址不同{'x': 10, 'y': 20}<__main__.Foo object at 0x0000000001E662C8> # foo_obj1的內存地址{'x': 10, 'y': 20}<__main__.Foo object at 0x0000000001E66408> # foo_obj2的內存地址  使用多個內存地址即浪費內存空間。

2、單例模式的優點

可以節省內存空間

3、單例模式實現方法

實現方法(*****)

1) 通過classmethod實現

2) 通過裝飾器實現

3) 通過__new__實現

4) 通過導入模塊時實現

5) 通過元類實現

例:假如資料庫被多臺伺服器調用啟動和關閉(使用classmethod實現)

class MySql: # 定義一個屬性默認值,用於判斷對象是否存在, 若對象不存在,屬性值默認是None # __instance是類的屬性 __instance = None def __init__(self, host, port): self.host = host self.port = port @classmethod def singleton(cls, host, port): # 單例方法 --> 類方法 # 判斷__instance中若沒有值,證明沒有對象 if not cls.__instance: # 產生一個對象並返回 obj = cls(host, port) # 從 None --> obj cls.__instance = obj # 若__instance有值,證明對象已經存在,則直接返回該對象 return cls.__instance def start_mysql(self): print("啟動資料庫。") def stop_mysql(self): print("關閉資料庫。")HOST1 = "192.168.9.1"PORT1 = "1532"HOST2 = "192.168.9.2"PORT2 = "1533"HOST3 = "192.168.9.3"PORT3 = "1534"obj1 = MySql.singleton(HOST1, PORT1)obj2 = MySql.singleton(HOST2, PORT2)obj3 = MySql.singleton(HOST3, PORT3)print(obj1)print(obj2)print(obj3)  執行結果:

# obj1、obj2、obj3調用的屬性相同,內存地址也相同<__main__.MySql object at 0x00000000021D6D48> # obj1的內存地址<__main__.MySql object at 0x00000000021D6D48> # obj2的內存地址<__main__.MySql object at 0x00000000021D6D48> # obj3的內存地址  使用同一個內存地址即節省內存空間。

相關焦點

  • Python設計模式之單例模式
    什麼場景會用到單例模式呢?就是在系統工程中只想創建單個實例對象,比如資料庫連接池,Redis連接池,服務監控中心等。這個場景下,如果存在多個實例對象,那麼會有無法預測的異常。同時,在設計單例模式時,需要考慮的很重要的因素就是並發性,即多線程調用時是否會存在多個線程。那麼,如何設計使用單例模式呢?
  • 面試必問的「單例模式」究竟是什麼鬼?有哪些優缺點和實現方式
    很多面試python初級崗位的同學,有大概率會被問到單例模式,而且一般都會現場讓你寫一個單例。可是有很多同學可能不是很理解,甚至專門把代碼背下來,說實話,有點不靠譜。放假啦!單例模式的作用全局變量,我相信大夥都不陌生吧。
  • 設計模式:單例模式
    這就是單例模式存在的原因。因為只需要創建該類的一個實例,不需要頻繁地創建和銷毀多個實例,因此單例模式可以節省內存並提高性能。不僅如此,它還讓程序代碼組織得更好,更簡單易讀。1.2 結構圖1 單例模式的類圖在文章開篇我們就說了單例模式是最簡單的設計模式,因此它的類圖也是相當的簡單,整個類圖中就只有一個類,如圖1所示。
  • 設計模式大冒險第四關:單例模式,如何成為你的「唯一」
    大家如果學習過設計模式,可能很多設計模式長時間不用就忘記了,但是對於單例模式來說,你肯定不會忘記。因為它的理論知識比較簡單,實踐起來也很方便。但是,你真的會正確的使用單例模式嗎?你知道單例模式在什麼情況下使用是合適的,什麼情況下使用會造成很多麻煩嗎?
  • 深入解析單例模式的七種實現
    來源:http://t.cn/E4J3ffX什麼是單例模式如何實現單例模式呢?單例模式的七種實現總結什麼是單例模式什麼是單例模式呢?好了,我們知道了單例模式的定義和如何使用單例的描述,接下來,就引用Linux Torvalds 的話:Talk is cheap.
  • Java的單例模式
    一、什麼是單例模式?
  • 為什麼要用單例模式?
    我們在編程中最常用的模式就是單例模式了,然而單例模式都用在什麼場合?為什麼不用靜態方法而要用單例模式呢?
  • 單例模式襲來
    吹一波單例模式❝確保某個類只有一個實例,而且自行實例化並向整個系統提供整個實例。說白了,就是"獨苗"!什麼是"自行實例化"?就是整個實例是在類內部自己創建的,不是在別的類中創建的。❞單例誰都會寫,而且五花八門,且隨洒家來瞅瞅。
  • Android設計模式(1)——單例模式
    單例模式使用的場景確保某個類有且只有一個對象的場景,避免產生多個對象消耗過多的資源,或者某種類型對象只應該有且只有一個,例如,創建一個對象需要消耗的資源過多,,如要訪問IO和資料庫等資源,這時就需要考慮使用單例模式。
  • 設計模式一:單例模式
    什麼是單例模式單例模式是指系統中的某個類只能有一個對象實例。
  • 手寫單例模式
    手寫單例模式為什麼要有單例模式: 在編程中,有些場景,是這樣的:
  • 深入淺出js單例模式
    何為單例模式?顧名思義,單例模式就是保證一個類僅有一個實例,也就是創建出來的兩個實例必須相等!
  • 大話設計模式之愛你一萬年:第二章 創建型模式:單例模式::我的女朋友只有你一個:3.4.5.單例模式的實現-餓漢/靜態/枚舉
    大話設計模式之愛你一萬年:第一章 設計模式基本概念:大話設計模式之愛你一萬年:第一章 設計模式基本概念:2.GoF的23種設計模式的分類和功能大話設計模式之愛你一萬年:第一章 設計模式基本概念:3.設計模式的六大原則大話設計模式之愛你一萬年:第二章 創建型模式:單例模式::我的女朋友只有你一個:1.單例模式的基本概念
  • Java單例模式深入詳解
    一.問題引入偶然想想到的如果把Java的構造方法弄成private,那裡面的成員屬性是不是只有通過static來訪問呢;如果構造方法是private的話,那麼有什麼好處呢;如果構造方法是private的話,會不更好的封裝該內呢?我主要是應用在使用普通類模擬枚舉類型裡,後來發現這就是傳說中的單例模式。
  • Java 實現單例模式的 9 種方法
    什麼是單例模式二. 單例模式的特點三. 單例模式VS靜態類四. 單例模式的實現一. 什麼是單例模式因進程需要,有時我們只需要某個類同時保留一個對象,不希望有更多對象,此時,我們則應考慮單例模式的設計。二. 單例模式的特點單例模式只能有一個實例。單例類必須創建自己的唯一實例。
  • PHP 單例模式的解析和實戰
    (給PHP開發者加星標,提升PHP技能)轉自:Houzhyanhttps://blog.csdn.net/h330531987/article/details/79100170一、什麼是單例模式1、含義   作為對象的創建模式,單例模式確保某一個類只有一個實例,而且自行實例化並向整個系統全局地提供這個實例。它不會創建實例副本,而是會向單例類內部存儲的實例返回一個引用。2、單例模式的三個要點:(1).
  • 一文帶你讀懂單例模式
    單例模式單例模式可以說是設計模式中最簡單的一個了,它屬於創建型模式,其定義如下:單例模式確保某個類只有一個實例,而且自行實例化並向整個系統提供這個實例。在應用這個模式時,單例對象的類必須保證只有一個實例存在。許多時候整個系統只需要擁有一個的全局對象,這樣有利於我們協調系統整體的行為。
  • 你真的理解了java單例模式嗎?講別人都忽略的細節
    前言:老劉這篇文章敢做保證,java的單例模式講的比大多數的技術博客都要好,講述別人技術博客都沒有的細節!!!1 java單例模式直接講實現單例模式的兩種方法:懶漢式和餓漢式,單例模式的概念自己上網搜吧這裡就不講了!
  • java設計模式中的單例模式,收藏起來慢慢看!
    在java中,單例模式算是比較基礎和簡單的,今天就來簡單聊聊什麼是單例模式。比如說,一個應用程式中,某個類的實例對象只有一個,而我們沒有辦法new,因為構造器已經被private聲明了,通過getInstance()的方法可以獲取它們的實例。
  • 單例模式絕對沒有想像的那麼簡單!不服來看!
    一、前言單例模式(Singleton Pattern)是 Java 中最常用的設計模式之一,同時也是面試的重災區。有些人可能覺的單例模式很簡單,沒有什麼難的。其實不然,因為牽扯到線程安全的問題,所以單例模式絕對能體現出你的功底。不信接著往下看。