【Python培訓基礎知識】單例模式
單例模式是保證一個類僅有一個例項的設計模式。Windows中的工作管理員就是一個典型的單例模式軟體。Windows工作管理員如圖所示。
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類,程式碼如下:
再建立Singleton類的兩個例項,程式碼如下:
最後透過id()函式生成兩個例項的記憶體地址,從而判斷Singleton類是不是單例類,程式碼如下:
執行結果:
由執行結果可知,這兩個例項的記憶體地址一致,說明是同一個例項,即生成的是單一例項,也就是說s1和s2其實是這一個例項的不同名稱而已,因此,Singleton類是單例類。
在上述示例的基礎上,先建立一個Mother類繼承Singleton類,類中包含例項屬性msg表示菜資訊,例項方法get_food()用於接收並拼接菜資訊msg,例項方法food()用於列印菜資訊msg:
再建立Mother類的兩個例項,並分別呼叫get_food()方法將菜資訊作為引數進行傳遞,程式碼如下:
最後分別列印這兩個例項的記憶體地址,並呼叫food()方法列印菜資訊,程式碼如下:
執行結果:
由於Monther類繼承了Singleton類,因此,例項mother1和mother2指向的是同一個記憶體地址,兩次呼叫get_food()方法,引數中的字串會拼接在一起,在呼叫food()方法時,列印結果都是拼接後的“蕃茄雞蛋”。
如果在建立Mother類時不繼承Singleton類,那麼執行結果是否發生改變呢?只修改定義Mother類的第一行程式碼,其餘程式碼不變,修改的程式碼如下:
執行結果:
由兩次的執行結果可知,修改之前列印的兩個記憶體地址是相同的,而修改之後列印的兩個記憶體地址不相同,說明修改之後建立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