Python單例模式

2021-08-11 01:58:43 字數 1810 閱讀 5751

new()在init()之前被呼叫,用於生成例項物件。利用這個方法和類的屬性的特點可以實現設計模式的單例模式。單例模式是指建立唯一物件,單例模式設計的類只能例項化1個物件。

class

singleton

(object):

__instance=none

def__init__(self):

pass

def__new__(cls,*args,**kwd):

if singleton.__instance is

none:

singleton.__instance=object.__new__(cls,*args,**kwd)

return singleton.__instance

單例模式是一種常用的軟體設計模式。在它的核心結構中只包含乙個被稱為單例類的特殊類。通過單例模式可以保證系統中乙個類只有乙個例項而且該例項易於外界訪問,從而方便對例項個數的控制並節約系統資源。如果希望在系統中某個類的物件只能存在乙個,單例模式是最好的解決方案。

顯然單例模式的要點有三個;一是某個類只能有乙個例項;二是它必須自行建立這個例項;三是它必須自行向整個系統提供這個例項。

從具體實現角度來說,就是以下三點:一是單例模式的類只提供私有的建構函式,二是類定義中含有乙個該類的靜態私有物件,三是該類提供了乙個靜態的共有的函式用於建立或獲取它本身的靜態私有物件。

在下面的物件圖中,有乙個」單例物件」,而」客戶甲」、」客戶乙」 和」客戶丙」是單例物件的三個客戶物件。可以看到,所有的客戶物件共享乙個單例物件。而且從單例物件到自身的連線線可以看出,單例物件持有對自己的引用。資源管理器常常設計成單例模式。

在 計算機系統中,需要管理的資源包括 軟體外部資源,譬如每台計算機可以有若干個印表機,但只能有乙個printer spooler, 以避免兩個列印作業同時輸出到印表機中。每台計算機可以有若干傳真卡,但是只應該有乙個軟體負責管理傳真卡,以避免出現兩份傳真作業同時傳到傳真卡中的情況。每台計算機可以有若干通訊埠,系統應當集中管理這些通訊埠,以避免乙個通訊埠同時被兩個請求同時呼叫。

需要管理的資源包括軟體內部資源,譬如,大多數的軟體都有乙個(甚至多個)屬性(properties)檔案存放 系統配置。這樣的系統應當由乙個物件來管理乙個屬性檔案。

需要管理的軟體內部資源也包括譬如負責記錄**來訪人數的部件,記錄軟體系統內部事件、出錯資訊的部件,或是對系統的表現進行檢查的部件等。這些部件都必須集中管理,不可政出多頭。

這些資源管理器構件必須只有乙個例項,這是其一;它們必須自行初始化,這是其二;允許整個系統訪問自己這是其三。因此,它們都滿足單例模式的條件,是單例模式的應用。

優點:一、例項控制

單例模式會阻止其他物件例項化其自己的單例物件的副本,從而確保所有物件都訪問唯一例項。

二、靈活性

因為類控制了例項化過程,所以類可以靈活更改例項化過程。

缺點:

一、開銷

雖然數量很少,但如果每次物件請求引用時都要檢查是否存在類的例項,將仍然需要一些開銷。可以通過使用靜態初始化解決此問題。

二、可能的開發混淆

使用單例物件(尤其在類庫中定義的物件)時,開發人員必須記住自己不能使用 new關鍵字例項化物件。因為可能無法訪問庫源**,因此應用程式開發人員可能會意外發現自己無法直接例項化此類。

三、物件生存期

不能解決刪除單個物件的問題。在提供記憶體管理的語言中(例如基於.net framework的語言),只有單例類能夠導致例項被取消分配,因為它包含對該例項的私有引用。在某些語言中(如 c++),其他類可以刪除物件例項,但這樣會導致單例類中出現懸浮引用。

python單例模式繼承 python單例模式

我們可以使用 new 這個特殊方法。該方法可以建立乙個其所在類的子類的物件。更可喜的是,我們的內建 object 基類實現了 new 方法,所以我們只需讓 sing 類繼承 object 類,就可以利用 object 的 new 方法來建立 sing 物件了。classsing object def...

單例模式 python

單例模式 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。實現 某個類只有乙個例項 途徑 1 讓乙個全域性變數使得乙個物件被訪問,但是它不能防止外部例項化多個物件。2 讓類自身負責儲存它的唯一例項。這個類可以保證沒有其他例項可以被建立。即單例模式。多執行緒時的單例模式 加鎖 雙重鎖定。餓漢式...

python單例模式

new 在 init 之前被呼叫,用於生成例項物件。利用這個方法和類的屬性的特點可以實現設計模式的單例模式。單例模式是指建立唯一物件,單例模式設計的類只能例項 例項化1個物件。class singleton object instance none def init self pass def ne...