Python 單例設計模式

2021-09-27 05:53:37 字數 2579 閱讀 3459

在記憶體中為物件分配空間

返回物件引用

python 直譯器獲得物件引用後,將引用的第乙個引數,傳遞給 __new__ 方法

重寫 __new__ 方法的**非常固定!

重寫 __new__ 方法一點要 return super().__new__(cls)

否則 python的直譯器得不到分配了空間的物件引用,就不會呼叫物件的初始化方法

注意:__new__ 是乙個靜態方法,在呼叫是需要主動傳遞 cls 引數

class

musicplayer(object):

def__new__(cls,*args,**kwargs):

#1、建立物件時,new方法會被自動呼叫

print("

建立物件,分配空間...")

#2、為物件分配空間

instance = super().__new__

(cls)

#3、返回物件的引用

return

instance

def__init__

(self):

print("")

#建立物件

player =musicplayer()

print(player)

執行結果為:

建立物件,分配空間...

<__main__.musicplayer object at>

定義乙個類屬性,初始值是none,用於記錄單例物件的應用

重寫 __new__ 方法

如果類屬性 is none ,呼叫父類方法分配空間,並在類屬性中記錄結果

返回類屬性中記錄的物件引用

class

musicplayer(object):

#記錄第乙個被建立物件的引用

instance =none

def__new__(cls,*args,**kwargs):

#1、判斷類屬性是否是空物件

if cls.instance is

none:

#2、呼叫父類方法,為第乙個物件分配空間

cls.instance = super().__new__

(cls)

#3、返回類屬性儲存的物件引用

return

cls.instance

#建立多個物件

player1 =musicplayer()

print

(player1)

player2 =musicplayer()

print(player2)

結果為:

<__main__.musicplayer object at>

<__main__.musicplayer object at>

每次呼叫 類名() 建立物件時,python直譯器會自動呼叫兩個方法:

__new__ 分配空間

__init__ 物件初始化

解決辦法:

定義乙個類屬性 init_flag 標記是否執行過初始化動作,初始值為 false

在 __init__ 方法中,判斷 init_flag,如果為 false 就執行初始化動作

然後將 init_flag 設定為 true

這樣,再次呼叫 __init__ 方法世,初始化動作就不會再執行了

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):

#1、判斷是否執行過初始化動作

ifmusicplayer.init_flag:

return

#2、如果沒有執行過,在執行初始化動作

print("")

#3、修改類屬性的標記

musicplayer.init_flag =true

#建立多個物件

player1 =musicplayer()

print

(player1)

player2 =musicplayer()

print(player2)

結果為:

<__main__.musicplayer object at>

<__main__.musicplayer object at>

原貼:

python設計模式 單例設計模式

樣式一 class musicplayer object instance none 設定類屬性,用來判斷是否有物件得到記憶體空間 init flag false 0表示還沒有初始化 1代表已經初始化 使用內建函式進行空間的分配 def new cls,args,kwargs cls 哪個類呼叫,就...

python設計模式 單例

是一種常用的設計模式,該模式的主要目的是確保某乙個類有且只有乙個例項存在。當希望系統中,某個類只能出現乙個例項時,就可以應用單例物件。每個例項都會占用一定的記憶體資源,且初始化例項時會影響執行效能,所以當整個系統只需乙個例項時,使用單例模式不僅可減少資源占用,而且因為只初始化一次,還可以加快執行效能...

python 單例設計模式

windows系統中的 站,無論任何地方呼叫的 站都指向的是同乙個 站,站的屬性和方法會被重複呼叫,這樣容易產生衝突浪費資源,這種情況下,單例模式就是乙個很好的實現方法。python的設計模式主要有三大類 建立類設計模式 結構類設計模式 行為類設計模式 python與設計模式相關介紹 類是抽象的,先...