1. <dd id="jcnig"><nav id="jcnig"><delect id="jcnig"></delect></nav></dd>
      <dfn id="jcnig"><tt id="jcnig"><sup id="jcnig"></sup></tt></dfn>

    2. <cite id="jcnig"></cite>
      <cite id="jcnig"><tt id="jcnig"></tt></cite>

      <address id="jcnig"><nav id="jcnig"></nav></address>
    3. <address id="jcnig"><nav id="jcnig"></nav></address>
      400-650-7353

      精品課程

      您所在的位置:首頁 > IT干貨資料 > python > 【Python基礎知識】單例模式

      【Python基礎知識】單例模式

      • 發布: python培訓
      • 來源:python培訓問答
      • 2021-03-22 16:22:06
      • 閱讀()
      • 分享
      • 手機端入口

      單例模式是保證一個類僅有一個實例的設計模式。Windows中的任務管理器就是一個典型的單例模式軟件。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語句判斷當前類的實例是否存在,如果不存在,那么需要先創建實例,再返回當前類的實例;如果存在,那么直接返回當前類的實例?梢圆捎脙煞N方式來創建實例,第一種方式是父類object調用魔法方法__new__(),參數為當前類本身;第二種是用super()方法,指定調用當前類父類的__new__()方法。

      【Python基礎知識】單例模式

      下面是一個單例類的示例。先編寫一個Singleton類,代碼如下:

      1. class Singleton(object): 
      2.     def __new__(cls, *args, **kwargs): 
      3.         if not hasattr(cls'_instance'): 
      4.             cls._instance = object.__new__(cls
      5.             # cls._instance = super(Singleton, cls).__new__(cls) 
      6.         return cls._instance 

      再創建Singleton類的兩個實例,代碼如下:

      1. s1 = Singleton() 
      2. s2 = Singleton() 

      最后通過id()函數生成兩個實例的內存地址,從而判斷Singleton類是不是單例類,代碼如下:

      1. print('s1的地址:{},s2的地址:{}'.format(id(s1), id(s2))) 

      運行結果:

      1. s1的地址:31244920,s2的地址:31244920 

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

      在上述示例的基礎上,先創建一個Mother類繼承Singleton類,類中包含實例屬性msg表示菜信息,實例方法get_food()用于接收并拼接菜信息msg,實例方法food()用于打印菜信息msg:

      1. class Mother(Singleton):   # 繼承Singleton類 
      2.     def __init__(self, msg=''): 
      3.         self.msg = msg 
      4.     def get_food(self, new_food): 
      5.         self.msg += new_food 
      6.     def food(self): 
      7.         print('做菜:'self.msg) 

      再創建Mother類的兩個實例,并分別調用get_food()方法將菜信息作為參數進行傳遞,代碼如下:

      1. mother1 = Mother() 
      2. mother2 = Mother() 
      3. mother1.get_food('西紅柿'
      4. mother2.get_food('雞蛋'

      最后分別打印這兩個實例的內存地址,并調用food()方法打印菜信息,代碼如下:

      1. print('兒子的媽媽id:', id(mother1)) 
      2. mother1.food() 
      3. print('女兒的媽媽id:', id(mother2)) 
      4. mother2.food() 

      運行結果:

      1. 兒子的媽媽id: 5758896 
      2. 做菜: 西紅柿雞蛋 
      3. 女兒的媽媽id: 5758896 
      4. 做菜: 西紅柿雞蛋 

      由于Monther類繼承了Singleton類,因此,實例mother1和mother2指向的是同一個內存地址,兩次調用get_food()方法,參數中的字符串會拼接在一起,在調用food()方法時,打印結果都是拼接后的“西紅柿雞蛋”。

      如果在創建Mother類時不繼承Singleton類,那么運行結果是否發生改變呢?只修改定義Mother類的第一行代碼,其余代碼不變,修改的代碼如下:

      1. class Mother(): 

      運行結果:

      1. 兒子的媽媽id: 169246848 
      2. 做菜: 西紅柿 
      3. 女兒的媽媽id: 169246904 
      4. 做菜: 雞蛋 

      由兩次的運行結果可知,修改之前打印的兩個內存地址是相同的,而修改之后打印的兩個內存地址不相同,說明修改之后創建Monther類的兩個實例是不同的實例,因此,這兩個實例分別調用get_food()方法時,字符串不會進行拼接,調用food()方法時打印結果也不相同。

      綜上所述,單例模式只有唯一實例,解決資源共享問題,節約系統內存,提高系統運行效率。

      學習疑問申請解答
      您的姓名
      您的電話
      意向課程
       

      中公優就業

      IT小助手

      掃描上方二維碼添加好友,請備注:599,享學習福利。

      >>本文地址:
      注:本站稿件未經許可不得轉載,轉載請保留出處及源文件地址。

      推薦閱讀

      優就業:ujiuye

      關注中公優就業官方微信

      • 關注微信回復關鍵詞“大禮包”,享學習福利
      QQ交流群
      在線疑問解答
      (加群備注“網站”)
      IT培訓交流群 加入群聊 +
      軟件測試 加入群聊 +
      全鏈路UI/UE設計 加入群聊 +
      Python+人工智能 加入群聊 +
      互聯網營銷 加入群聊 +
      Java開發 加入群聊 +
      PHP開發 加入群聊 +
      VR/AR游戲開發 加入群聊 +
      大前端 加入群聊 +
      大數據 加入群聊 +
      Linux云計算 加入群聊 +
      優就業官方微信
      掃碼回復關鍵詞“大禮包”
      享學習福利

      測一測
      你適合學哪門IT技術?

      1 您的年齡

      2 您的學歷

      3 您更想做哪個方向的工作?

      獲取測試結果
       
      課程資料、活動優惠 領取通道
       
       
      日本一本二本三本av网站,一本加勒比HEZYO东京热高清,一本久久A久久精品综合