首頁 > 後端開發 > Python教學 > Python單例模式實例

Python單例模式實例

高洛峰
發布: 2017-03-03 11:57:47
原創
1162 人瀏覽過

本文實例講述了Python單例模式。分享給大家供大家參考,具體如下:

單例模式:保證一個類別只有一個實例,並提供一個存取他的全局訪問點。

實作某個類別只有一個實例的途徑:

1,讓一個全域變數使得一個物件被訪問,但是他無法防止外部實例化多個對象。

2,讓類別本身保存他的唯一實例,這個類別可以保證沒有其他實例可以被創建。

多執行緒時的單例模式:加上鎖定-雙重鎖定

#餓漢式單例類別:在類別被載入時就將自己實例化(靜態初始化)。其優點是躲避了多執行緒存取的安全性問題,缺點是提前佔用系統資源。

懶漢式單例類別:在第一次被引用時,才將自己實例化。避免開始時佔用系統資源,但是有多執行緒存取安全性問題。

實例:

#encoding=utf-8
#单例模式
def PrintInfo(info):
#  print unicode(info,'utf-8').decode('gbk')
  print info.decode('utf-8').encode('utf-8')
import threading
#单例类
class Singleton():
  instance=None
  mutex=threading.Lock()
  def _init__(self):
    pass
  @staticmethod
  def GetInstance():
    if(Singleton.instance==None):
      Singleton.mutex.acquire()
      if(Singleton.instance==None):
        PrintInfo('初始化实例')
        Singleton.instance=Singleton()
      else:
        PrintInfo('单例已经实例化')
      Singleton.mutex.release()
    else:
      PrintInfo('单例已经实例化')
    return Singleton.instance
def clientUI():
  Singleton.GetInstance()
  Singleton.GetInstance()
  Singleton.GetInstance()
  return
if __name__=='__main__':
  clientUI();
登入後複製

#結果:

##

初始化实例 单例已经实例化 单例已经实例化
登入後複製

追加解釋@staticmethod 在Python中提到classmethod 就要提到staticmethod,不是因為二者有什麼關係,而是為了讓用戶區分以便更清楚地寫程式碼。在C++中,我們了解直接透過類別名稱存取的函數稱為類別的靜態函數,也就是static修飾的函數,可見C++中classmethod和staticmethod是一個概念。 那麼python中二者有什麼差別呢?先來看下二者如何在python程式碼中宣告

class MyClass:
 ...
 @classmethod # classmethod的修饰符
 def class_method(cls, arg1, arg2, ...):
  ...
 @staticmethod # staticmethod的修饰符
 def static_method(arg1, arg2, ...):
  ...
登入後複製

對於classmethod的參數,需要隱式地傳遞類別名,而staticmethod參數中則不需要傳遞類別名,其實這就是二者最大的差別。

二者都可以透過類別名稱或類別實例物件來調用,因為強調的是classmethod和staticmethod,所以在寫程式碼的時候最好使用類別名,良好的程式設計習慣吧。

對於staticmethod就是為了要在類別中定義而設定的,一般來說很少這樣使用,可以使用模組級(module-level)的函數來取代它。既然要把它定義在類別中,想必有作者的考慮。

對於classmethod,可以透過子類別來進行重定義。

提到類別層級的函數,也順帶提及類別層級的變數

class MyClass:
 i = 123 # class-level variable
 def __init__(self):
 self.i = 456 # object-level variable
 ...
登入後複製

為了清楚地區分上面兩個i,最好的方法就是考慮到python中的一切都是object,所以i=123屬於class object的,i=456屬於class instance object

更多Python單例模式實例相關文章請關注PHP中文網!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板