單例模式:即乙個類有且僅有乙個例項。
那麼通過python怎麼實現乙個類只能有乙個例項呢。
class
earth
:"""
假如你是神,你可以創造地球
"""print
'歡迎來到地球'
# 生成乙個地球
a = earth(
)print
id(a)
# 再生成乙個地球
b = earth(
)print
id(b)
輸出:
歡迎來到地球
53356616
59869960
從上面例子可以看到,地球被建立了兩次,因為地球只能有乙個,所以earth類只能有乙個例項,所以需要單例模式實現。
python中,乙個類建立物件例項是通過呼叫父類object的__new__(cls)
方法來建立物件的
我們可以通過重寫__new__(cls)
方法去實現類只建立乙個例項,再建立的例項返回上一次的物件的引用。
class
earth
(object):
""" """
# 定義乙個類屬性做判斷
instance =
none
def__new__
(cls,
*args,
**kwargs)
:# 如果instance為空則說明是第一次建立例項
# 通過父類的__new__(cls)建立例項
if cls.instance ==
none
:# 呼叫父類的__new__(cls)方法建立例項,並將該例項賦值給類變數instance,此時該變數的值從none變為該例項
cls.instance =
object
.__new__(cls)
# print cls.instance
# 返回例項化物件
return cls.instance
else
:# 返回上乙個物件的引用
return cls.instance
# print '歡迎來到地球'
print
'原始的instance值為:%s'
% earth.instance
# 生成乙個地球
a = earth(
)# 建立例項後的instance值
print
'建立例項後的instance值為:%s'
% earth.instance
print
id(a)
# 再生成乙個地球
b = earth(
)print
id(b)
輸出:
原始的instance值為:none
建立例項後的instance值為:<__main__.earth object at 0x0000000003090e10
>
50925072
50925072
可以看到兩次的id相同,為同乙個物件 Python 單例模式( new
單例模式 簡單的理解就是乙個類只有乙個例項 參考 繼承自singleton的子類,並且該子類未重寫 new 方法,則該子類為但單例類 class singleton object 使用 new 實現單例 instance none def new cls,args,kwargs if not cls...
python單例模式和 new
在知道單例模式之前,就要先了解類的 new 方法 python類中 new 方法是最先執行的,因為 new 方法就是給python類提供乙個記憶體位址,當其他地方呼叫這個類後,就是在這個提供的記憶體位址進行執行,而每乙個記憶體位址同一時間內只能執行乙個專案。所以我們只需要在重寫一下 new 方法,在...
單例模式 new
單例模式,使用 new new 是建構函式,init 是初始化方法,先呼叫了 new 返回了例項,init 給這個例項初始化繫結一些屬性。1 class singleton object 23 def new cls,args,kw 4if not hasattr cls,instance 5 cl...