1--單例設計模式
。--目的--讓類建立的物件,在系統張總只有唯一的乙個例項
。--使用設計模式 是為了可重用**、讓**更容易被他人理解、保證**可靠性
2--__new__方法
。--使用類名()建立物件時,python的直譯器首先會呼叫 __new__ 方法為物件分配空間
。--__new__ 是乙個由object基類提供的內建的靜態方法,主要作用:
--在記憶體中位物件分配空間
--返回物件的引用
。--python的直譯器獲得物件的引用後,將引用作為第乙個引數,傳遞給 __init__ 方法
。--重寫 __new__ 方法的**非常固定
。--重寫 __new__ 方法一定要 return super().__new__(cls)
。--否則python的直譯器得不到分配了空間的物件引用,就不會呼叫物件的初始化方法
**注意:__new__ 是乙個靜態方法,在呼叫時需要主動傳遞cls引數
3--重寫__new__ 方法,實現單例
。--重寫new方法
class musicplayer(object):
def __new__(cls,*args,**kwargs):
#建立物件時,new方法會被自動呼叫
print("建立物件,分配空間")
#為物件分配空間
instance=super.__new__(cls)
#放回物件的引用
return instance
def __init__ (self):
player=musicplayer()
。--實現單例
class musicplayer(object):
instance=none
def __new__(cls,*args,**kwargs):
#建立物件時,new方法會被自動呼叫
print("建立物件,分配空間")
if cls.instace is none:
#為物件分配空間
cls.instance=super.__new__(cls)
#放回物件的引用
return cls.instance
def __init__ (self):
player=musicplayer()
4--初始化動作只執行一次
。--在每次執行 類名() 建立物件時,python的直譯器都會自動呼叫兩個方法:
--__new__方法,分配空間
--__init__方法,物件初始化
。--在上面,對__new__方法改造之後,每次都會第一次被建立物件的引用
。--但是:初始化方法還會再次被呼叫
。--需求:讓初始化動作只被執行一次
--定義乙個類屬性,init_flag標記是否執行過初始化動作,初始值為false
--在__init__方法中,判斷init_flag,如果為false就執行初始化動作
--然後將init_flag設定為ture
--這樣,再次呼叫__init__方法時,初始化動作就不會被再次執行了
例:class musicplayer(object):
instance=none
init_flag=false
def __new__(cls,*args,**kwargs):
#建立物件時,new方法會被自動呼叫
print("建立物件,分配空間")
if cls.instace is none:
#為物件分配空間
cls.instance=super.__new__(cls)
#放回物件的引用
return cls.instance
def __init__ (self):
if musicplayer.init_flag:
return
musicplayer.init_flag=ture
player=musicplayer()
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 方法,在...
python 單例模式 使用 new
單例模式 即乙個類有且僅有乙個例項。那麼通過python怎麼實現乙個類只能有乙個例項呢。class earth 假如你是神,你可以創造地球 print 歡迎來到地球 生成乙個地球 a earth print id a 再生成乙個地球 b earth print id b 輸出 歡迎來到地球 5335...