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

2021-10-16 15:32:40 字數 1299 閱讀 7941

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

classsing(object):

def__init__():

"disable the __init__ method"

__inst = none# make it so-called private

@staticmethod

defgetinst():

ifnotsing.__inst:

sing.__inst = object.__new__(sing)

returnsing.__inst

現在我們只能通過 sing.getinst() 來建立 sing 物件了。而且我們也讓類屬性 __inst 保持了私有(雖然在 python 中還是有辦法訪問)。那麼,這是否意味著基本沒有問題了?當然不是!我們還應該解決乙個最關鍵的多執行緒問題。

同時,我們應該還注意到,由於我們禁用了 __init__ 方法(顯式定義了它),我們就應該顯式的呼叫其基類的 __init__ 方法(或許這裡的 object 類對於我們無關痛癢),以作完整的初始化。當然,這個顯式的呼叫也應該移到 getinst() 中去了。

importthreading

classsing(object):

def__init__():

"disable the __init__ method"

__inst = none# make it so-called private

__lock = threading.lock() # used to synchronize code

@staticmethod

defgetinst():

sing.__lock.acquire()

ifnotsing.__inst:

sing.__inst = object.__new__(sing)

object.__init__(sing.__inst)

sing.__lock.release()

returnsing.__inst

上面的**中,sing.__lock.acquire() 和 sing.__lock.release() 之間的是同步區域,它保證了物件建立的唯一性。同時,object 的 __init__ 方法呼叫僅僅置於 if 塊中,因為它和 sing 例項一樣僅需初始化一次。好了,現在我們的 singleton 模式應該是基本完善了。

Python單例模式與繼承

使用new class singleton object 使用new new 從無到有的過程 為了保證乙個類只有乙個例項,使用 new 來控制例項的建立過程 instance none def new cls,args,kwargs ifnot cls.instance cls.instance s...

繼承單例模式 php PHP設計模式之單例模式

單例模式,就是保持乙個物件只存在乙個例項。並且為該唯一例項提供乙個全域性的訪問點 一般是乙個靜態的getinstance方法 單例模式應用場景非常廣泛,例如 資料庫操作物件 日誌寫入物件 全域性配置解析物件 這些場景的共同特徵是從業務邏輯上來看執行期間改物件卻是只有乙個例項 不斷new多個例項會增加...

單例模式 python

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