【Python培訓基礎知識】單例模式
單例模式是保證一個類僅有一個例項的設計模式。Windows中的工作管理員就是一個典型的單例模式軟體。Windows工作管理員如圖所示。
![1](https://i.iter01.com/images/b5449a983ecf68ee6b3c019acc65adb59a38e9bff4d218d8e5b1742674c6dc19.png)
Windows工作管理員只能開啟一個,即使使用者重複開啟,也只能獲得一個例項,這不同於Word等軟體可以開啟多個例項。這是因為如果有2個視窗同時都能結束程式,那麼在視窗A中結束了某程式,而在視窗B中該程式還保留著;反之,在視窗B中結束了某程式,而在視窗A中該程式還保留著。這樣就會造成衝突,導致系統崩潰。
定義單例類的語法格式如下:
class 類名(object):
def __new__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
# 第一種方式
cls._instance = object.__new__(cls)
# 第二種方式
# cls._instance = super(類名, cls).__new__(cls)
return cls._instance
建立的單例類繼承了object類。類中定義了一個魔法方法__new__(),__new__()方法是建立例項時呼叫的方法,因此,常說的建立一個例項,其實就是使用這個方法建立的。在__new__()方法中,第一個引數為cls,說明這是一個類方法,後面兩個引數分別為*args和**kwargs。用這個方法來建立唯一例項。__new__()方法中,採用if語句判斷當前類的例項是否存在,如果不存在,那麼需要先建立例項,再返回當前類的例項;如果存在,那麼直接返回當前類的例項。可以採用兩種方式來建立例項,第一種方式是父類object呼叫魔法方法__new__(),引數為當前類本身;第二種是用super()方法,指定呼叫當前類父類的__new__()方法。
下面是一個單例類的示例。先編寫一個Singleton類,程式碼如下:
![2](https://i.iter01.com/images/24811f365911d06790c4b1702104a78fbe085e62efc32810e9255c7d865d8bfd.png)
再建立Singleton類的兩個例項,程式碼如下:
![3](https://i.iter01.com/images/570162d23e19bd117dea9d657f4b1daffd5cceb9fb34b0cf818bd3e640d2df3b.png)
最後透過id()函式生成兩個例項的記憶體地址,從而判斷Singleton類是不是單例類,程式碼如下:
![4](https://i.iter01.com/images/6db0770602d585f124ae1f3dcf3b19f1a2ebc3bdb65508bb82ef749953643404.png)
執行結果:
![5](https://i.iter01.com/images/ec50c0fb8b3c1bcc130b3076ae28be70e2ee1a83502b6eb9c6b73d77edb68b41.png)
由執行結果可知,這兩個例項的記憶體地址一致,說明是同一個例項,即生成的是單一例項,也就是說s1和s2其實是這一個例項的不同名稱而已,因此,Singleton類是單例類。
在上述示例的基礎上,先建立一個Mother類繼承Singleton類,類中包含例項屬性msg表示菜資訊,例項方法get_food()用於接收並拼接菜資訊msg,例項方法food()用於列印菜資訊msg:
![6](https://i.iter01.com/images/edf0358d99d8ef96c9c5c4265e1c488b09e393560d161490d46d540b935d3f18.png)
再建立Mother類的兩個例項,並分別呼叫get_food()方法將菜資訊作為引數進行傳遞,程式碼如下:
![7](https://i.iter01.com/images/1699bc397aa410f2d57bc7524ee3510a8dd5294fb02eea808fb89fb1c93dcf69.png)
最後分別列印這兩個例項的記憶體地址,並呼叫food()方法列印菜資訊,程式碼如下:
![8](https://i.iter01.com/images/aa29ffba8844f00387af9dd7573529c4b558080ee9929cd4e35c576ca37cd176.png)
執行結果:
![9](https://i.iter01.com/images/d437802ed0ffb6ebc007a8ac10c7c9ff7e1ee900f61c6e408ade297eb194f3ed.png)
由於Monther類繼承了Singleton類,因此,例項mother1和mother2指向的是同一個記憶體地址,兩次呼叫get_food()方法,引數中的字串會拼接在一起,在呼叫food()方法時,列印結果都是拼接後的“蕃茄雞蛋”。
如果在建立Mother類時不繼承Singleton類,那麼執行結果是否發生改變呢?只修改定義Mother類的第一行程式碼,其餘程式碼不變,修改的程式碼如下:
![11](https://i.iter01.com/images/a66188306933673ddcaf46c9e791f1963260cbbd9b47a456a4cf57c4e384c88d.png)
執行結果:
![10](https://i.iter01.com/images/11e1c6efe23a1421b289f2cf3818632c56d347ccdd656e095c4fc7d8573016ef.png)
由兩次的執行結果可知,修改之前列印的兩個記憶體地址是相同的,而修改之後列印的兩個記憶體地址不相同,說明修改之後建立Monther類的兩個例項是不同的例項,因此,這兩個例項分別呼叫get_food()方法時,字串不會進行拼接,呼叫food()方法時列印結果也不相同。
綜上所述,單例模式只有唯一例項,解決資源共享問題,節約系統記憶體,提高系統執行效率。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69996644/viewspace-2766197/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Python培訓教程之Python基礎知識點梳理Python
- 【Python培訓基礎知識】Python生成器函式Python函式
- Python培訓入門基礎知識學什麼?Python
- java培訓基礎知識都學哪些Java
- 好程式設計師Python培訓分享Python入門基礎知識程式設計師Python
- Python入門基礎知識例項,Python
- Java培訓基礎知識-Java的常量與變數Java變數
- 用例基礎知識
- Java基礎-單例模式Java單例模式
- python基礎知識Python
- python 基礎知識Python
- python爬蟲之Beautiful Soup基礎知識+例項Python爬蟲
- Python培訓基礎教程都教哪些Python
- Python基礎知識1Python
- Python基礎知識整理Python
- Python基礎知識分享Python
- 好程式設計師Java培訓分享Java基礎知識總結程式設計師Java
- 通過綠帶培訓獲得六西格瑪基礎知識
- Python知識體系-Python2基礎知識Python
- ABAQUS基礎培訓
- Vue基礎知識講解——記一次給後端的培訓Vue後端
- 好程式設計師web前端培訓分享CSS基礎知識學習程式設計師Web前端CSS
- 華為內部的RD_射頻基礎知識培訓資料
- Java培訓零基礎學員必須要知道的知識點Java
- 【UI設計培訓基礎知識】設計中的點線面-線UI
- 【Web前端培訓基礎知識】ES5及ES6this詳解Web前端
- Azure 知識培訓總結
- Python基礎知識之字典Python
- Python基礎知識之集合Python
- Python基礎知識架構Python架構
- Python基礎知識之二Python
- Python——基礎知識細節Python
- Python基礎知識點梳理Python
- 好程式設計師大資料培訓分享Hive基礎知識講解程式設計師大資料Hive
- 好程式設計師HTML5培訓教程-html和css基礎知識程式設計師HTMLCSS
- Python爬蟲筆記(一)——基礎知識簡單整理Python爬蟲筆記
- Python基礎知識入門(二)Python
- Python入門基礎知識(二)Python