【Python培訓基礎知識】單例模式

千鋒教育qyf發表於2021-04-01

  單例模式是保證一個類僅有一個例項的設計模式。Windows中的工作管理員就是一個典型的單例模式軟體。Windows工作管理員如圖所示。

  

1

  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

  再建立Singleton類的兩個例項,程式碼如下:

  

3

  最後透過id()函式生成兩個例項的記憶體地址,從而判斷Singleton類是不是單例類,程式碼如下:

  

4

  執行結果:

  

5

  由執行結果可知,這兩個例項的記憶體地址一致,說明是同一個例項,即生成的是單一例項,也就是說s1和s2其實是這一個例項的不同名稱而已,因此,Singleton類是單例類。

  在上述示例的基礎上,先建立一個Mother類繼承Singleton類,類中包含例項屬性msg表示菜資訊,例項方法get_food()用於接收並拼接菜資訊msg,例項方法food()用於列印菜資訊msg:

  

6

  再建立Mother類的兩個例項,並分別呼叫get_food()方法將菜資訊作為引數進行傳遞,程式碼如下:

  

7

  最後分別列印這兩個例項的記憶體地址,並呼叫food()方法列印菜資訊,程式碼如下:

  

8

  執行結果:

  

9

  由於Monther類繼承了Singleton類,因此,例項mother1和mother2指向的是同一個記憶體地址,兩次呼叫get_food()方法,引數中的字串會拼接在一起,在呼叫food()方法時,列印結果都是拼接後的“蕃茄雞蛋”。

  如果在建立Mother類時不繼承Singleton類,那麼執行結果是否發生改變呢?只修改定義Mother類的第一行程式碼,其餘程式碼不變,修改的程式碼如下:

  

11

  執行結果:

  

10

  由兩次的執行結果可知,修改之前列印的兩個記憶體地址是相同的,而修改之後列印的兩個記憶體地址不相同,說明修改之後建立Monther類的兩個例項是不同的例項,因此,這兩個例項分別呼叫get_food()方法時,字串不會進行拼接,呼叫food()方法時列印結果也不相同。

  綜上所述,單例模式只有唯一例項,解決資源共享問題,節約系統記憶體,提高系統執行效率。



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69996644/viewspace-2766197/,如需轉載,請註明出處,否則將追究法律責任。

相關文章