**站 物件
印表機 物件
…使用類名()建立物件時,python 的直譯器首先 會 呼叫__new__
方法為物件 分配空間。
__new__
是乙個 由object
基類提供的內建的靜態方法,主要作用有兩個:
python 的直譯器
獲得物件的 引用 後,將引用作為 第乙個引數,傳遞給__init__
方法。
重寫__new__
方法 的**非常固定!
如果要得到當前類的例項,應當在當前類中的__new__()
方法語句中呼叫當前類的父類的__new__()
方法。
例如,如果當前類是直接繼承自object
,那當前類的__new__()
方法返回的物件應該為:
def
__new__
(cls,
*args,
**kwargs):.
..return
object
.__new__(cls)
注意:class
musicplayer
(object):
def__new__
(cls,
*args,
**kwargs)
:# 建立物件時,new方法會被自動呼叫
print
("建立物件,分配空間"
)# 為物件分配空間
# instance = super().__new__(cls)
# 返回物件的引用
# return instance
# 或者一步到位,為物件分配空間並返回物件的引用
return
super()
.__new__(cls)
def__init__
(self)
:print()
player = musicplayer(
)print
(player)
單例 —— 讓 類 建立的物件,在系統中 只有 唯一的乙個例項# 定義類屬性記錄單例物件引用
instance =
none
def__new__
(cls,
*args,
**kwargs)
:# 1. 判斷類屬性是否已經被賦值
if cls.instance is
none
: cls.instance =
super()
.__new__(cls)
# 2. 返回類屬性的單例引用
return cls.instance
只執行一次初始化工作
new分配空間
init物件初始化
上面的**對__new__
方法改造之後,每次都會得到 第一次被建立物件的引用
但是:初始化方法還會被再次呼叫
需求:解決辦法
實現:
class
musicplayer
(object):
# 記錄第乙個被建立物件的引用
instance =
none
# 記錄是否執行過初始化動作
init_flag =
false
def__new__
(cls,
*args,
**kwargs)
:# 1. 判斷類屬性是否是空物件
if cls.instance is
none
:# 2. 呼叫父類的方法,為第乙個物件分配空間
cls.instance =
super()
.__new__(cls)
# 3. 返回類屬性儲存的物件引用
return cls.instance
def__init__
(self):if
not musicplayer.init_flag:
print()
musicplayer.init_flag =
true
#測試:
# 建立多個物件
player1 = musicplayer(
)print
(player1)
player2 = musicplayer(
)print
(player2)
終於寫完了 python設計模式之單例模式
單例模式是一種建立型設計模式,它確保乙個類有且只有乙個特定型別的物件,並提供全域性訪問點。其意圖為 簡單理解 單例即為單個例項,也就是每次例項化建立物件時獲得的都是同乙個物件,當然同乙個物件的屬性都是相同的,方法也是相同的,位址也是相同的,這樣給我們帶來的好處就是可以避免消耗過多的記憶體或cpu資源...
Python設計模式之單例模式
單例模式屬於建立型模式,它提供了一種建立物件的最佳方式。這種模式涉及到乙個單一的類,該類負責建立自己的物件,同時確保只有單個物件被建立。這個類提供了一種訪問其唯一的物件的方式,可以直接訪問,不需要例項化該類的物件。單例模式是獲取全域性狀態的一種相當好的方法,但這也是對於單例模式的主要批評之處,因為在...
Python之單例設計模式
單例是一種設計模式,應用該模式的類只會生成乙個例項。單例模式保證了在程式的不同位置都可以且僅可以取到同乙個物件例項 如果例項不存在,會建立乙個例項 如果已存在就會返回這個例項。因為單例是乙個類,所以你也可以為其提供相應的操作方法,以便於對這個例項進行管理。以下是實現方法索引 使用 new 方法在創造...