單例模式:簡單的理解就是乙個類只有乙個例項
參考:繼承自singleton的子類,並且該子類未重寫__new__方法,則該子類為但單例類
class
singleton
(object):
"""使用__new__實現單例"""
_instance =
none
def__new__
(cls,
*args,
**kwargs):if
not cls._instance:
cls._instance =
super
(singleton, cls)
.__new__(cls)
return cls._instance
class
myclass
(singleton)
:def
__init__
(self, val)
: self.val = val
def__call__
(self)
:print
(self.val)
if __name__ ==
'__main__'
: s1 = myclass(2)
s1() s2 = myclass(3)
s2()print(,
id(s1)
)print(,
id(s2)
)
單例類執行結果
__new__請不要這麼寫
注:重寫__new__的單例類,請慎重使用__init__,我嘗試在子類中使用__init__來初始化子類,幾個小時也未能解決bug,如果有大神知道在怎麼寫__init__方法,還請不吝賜教,感激不盡
def
singleton
(cls,
*args,
**kwargs)
:"""單例模式"""
instances =
defget_instance
(*args,
**kwargs)
:# 第一次
if cls not
in instances:
instances[cls]
= cls(
*args,
**kwargs)
# 非第一次
return instances[cls]
return get_instance
@singleton
class
myclass
(object):
def__init__
(self, val)
: self.val = val
def__call__
(self)
:print
(self.val)
if __name__ ==
'__main__'
: s1 = myclass(2)
s1() s2 = myclass(3)
s2()print(,
id(s1)
)print(,
id(s2)
)
裝飾器單例模式結果
python單例模式和 new
在知道單例模式之前,就要先了解類的 new 方法 python類中 new 方法是最先執行的,因為 new 方法就是給python類提供乙個記憶體位址,當其他地方呼叫這個類後,就是在這個提供的記憶體位址進行執行,而每乙個記憶體位址同一時間內只能執行乙個專案。所以我們只需要在重寫一下 new 方法,在...
python 單例模式 使用 new
單例模式 即乙個類有且僅有乙個例項。那麼通過python怎麼實現乙個類只能有乙個例項呢。class earth 假如你是神,你可以創造地球 print 歡迎來到地球 生成乙個地球 a earth print id a 再生成乙個地球 b earth print id b 輸出 歡迎來到地球 5335...
單例模式 new
單例模式,使用 new new 是建構函式,init 是初始化方法,先呼叫了 new 返回了例項,init 給這個例項初始化繫結一些屬性。1 class singleton object 23 def new cls,args,kw 4if not hasattr cls,instance 5 cl...