一、基於裝飾器實現單例模式
#裝飾器實現單例模式
defsingleton
(cls)
:def
(*args,
**kwargs):if
nothasattr
(cls,
'_instance'):
cls._instance = cls(
*args,
**kwargs)
return cls._instance
@singleton
class
singletontest
:pass
s1 = singletontest(
) s2 = singletontest(
)print
(s1)
#<__main__.singletontest object at 0x0000000000656860>
print
(s2)
#<__main__.singletontest object at 0x0000000000656860>
二、基於元類實現單例模式
'''
'''class
mytype
(type):
def__call__
(self,
*args,
**kwargs)
:"""
self指的是singletontest類
:param args:
:param kwargs:
:return:
"""ifnot
hasattr
(self,
'_instance'):
self._instance =
super
(mytype,self)
.__call__(
*args,
**kwargs)
return self._instance
class
singletontest
(metaclass=mytype)
:pass
#singletontest是元類mytype的物件,物件加括號執行元類中的__call__方法
s1 = singletontest(
)s2 = singletontest(
)print
(s1)
#<__main__.singletontest object at 0x0000000000646898>
print
(s2)
#<__main__.singletontest object at 0x0000000000646898>
三、基於__new__方法實現單例模式
class
singletontest
:def
__new__
(cls,
*args,
**kwargs)
:"""
cls::param args:
:param kwargs:
:return:
"""ifnot
hasattr
(cls,
'_instance'):
cls._instance =
super
(singletontest,cls)
.__new__(cls,
*args,
**kwargs)
return cls._instance
s1 = singletontest(
)s2 = singletontest(
)print
(s1)
#<__main__.singletontest object at 0x0000000000bd68d0>
print
(s2)
#<__main__.singletontest object at 0x0000000000bd68d0>
四、基於靜態方法實現單例模式
'''
'''class
singletontest
: @classmethod
defgetinstance
(cls):if
nothasattr
(cls,
'_instance'):
cls._instance = cls(
)return cls._instance
s1 = singletontest.getinstance(
)s2 = singletontest.getinstance(
)print
(s1)
#<__main__.singletontest object at 0x0000000000646828>
print
(s2)
#<__main__.singletontest object at 0x0000000000646828>
五、基於模組實現單例模式
class
singletontest
:pass
s = singletontest(
)#在另乙個py檔案中匯入該類物件
from base import s
print
(s)
六、monostate單例模式
將所有建立物件的__dict__屬性指向同乙個字典,這樣所有的物件實現了資料的共享。
'''
'''class
borg
: __shared_state=
def__new__
(cls,
*args,
**kwargs)
: obj =
super
(borg,cls)
.__new__(cls,
*args,
**kwargs)
obj.__dict__ = cls.__shared_state
return obj
#共享同乙個字典,乙個物件改變屬性,另乙個也跟著改變
b1 = borg(
)b1.name =
'bright'
b2 = borg(
)print
(b1.__dict__)
#print
(b2.__dict__)
#
將__shared_state變數作為乙個中間變數,並且賦值給python中儲存類所有物件狀態的__dict__變數,這在例項後,會產生兩個不同的物件,但是b1.__dict__和b2.__dict__都指向了__shared_state的記憶體位址。
注意,這種單例模式是資料的單例,物件還是兩個不一樣的物件。
python建立單例模式
在面試python工作的過程中,python的單例模式會經常被問到,而且在工作當中,也經常會使用到,所以統計了一下python實現單例模式的幾種方式。實現python單例模式,共有四種模式 1.使用 new 方法 class singleton object def new cls,args,kw ...
python中單例模式
一 單例模式設計基礎概念 單例模式 singleton pattern 是一種常用的軟體設計模式,該模式的主要目的是確保某乙個類只有乙個例項存在。當你希望在整個系統中,某個類只能出現乙個例項時,單例物件就能派上用場。目的 讓類建立物件,在系統中只有唯一的乙個實例子 每一次執行類名 返回的物件 記憶體...
python中的單例模式
單例模式 顧名思義是只有乙個例項記憶體位址,根據意思理解就是不論建立多少個例項物件,都只有乙個記憶體位址,單例模式是基於類的,是例項類物件,有別與 init init 是例項化物件.如下 domeclass single instance object instance none def init ...