python物件導向程式設計 單例

2021-10-02 17:59:45 字數 2329 閱讀 4956

單例設計模式

**站物件

印表機物件

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

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

**示例****

class

music

(object):

def__new__

(cls,

*args,

**kwargs)

:# 如果不返回任何結果,

return

super()

.__new__(cls)

def__init__

(self)

:print

("初始化操作"

)player = music(

)print

(player)

class

music

(object):

# 定義類屬性記錄單例物件引用

instance =

none

def__new__

(cls,

*args,

**kwargs)

:# 1. 判斷類屬性是否已經被賦值

if cls.instance is

none

: cls.instance =

super()

.__new__(cls)

# 2. 返回類屬性的單例引用

return cls.instance

在上一小節對__new__方法改造之後,每次都會得到第一次被建立物件的引用但是:初始化方法還會被再次呼叫

需求

解決辦法

定義乙個類屬性init_flag標記是否執行過初始化動作,初始值為false__init__方法中,判斷init_flag,如果為false就執行初始化動作

然後將init_flag設定為true這樣,再次自動呼叫__init__方法時,初始化動作就不會被再次執行

class

music

(object):

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

instance =

none

# 記錄是否執行過初始化動作

init_flag =

false

def__new__

(cls,

*args,

**kwargs)

:# 1. 判斷類屬性是否是空物件, 呼叫父類的方法,為第乙個物件分配空間

if cls.instance is

none

: cls.instance =

super()

.__new__(cls)

# 2. 返回類屬性儲存的物件引用

return cls.instance

def__init__

(self)

:# 第一種寫法

if music.init_flag:

return

print

("初始化**"

) music.init_flag =

true

#----------------------------------------#

# 第二種寫法

ifnot musicplayer.init_flag:

print

("初始化**"

) musicplayer.init_flag =

true

# 建立多個物件

music1 = music(

)print

(music1 )

music2 = music(

)print

(music2 )

Python 物件導向 單例

單例設計模式 重寫 new 方法 的 非常固定!如果不返回任何結果,定義類屬性記錄單例物件引用 instance none def new cls,args,kwargs 1.判斷類屬性是否已經被賦值 if cls.instance is none cls.instance super new cl...

Python物件導向 17 單例

單例設計模式 設計模式 單例設計模式 new 方法class musicplayer object def new cls,args,kwargs 建立物件時 new方法會被自動呼叫 print 建立物件 分配空間 為物件分配空間 instance super new cls 返回物件的引用 ret...

python 物件導向 10 單例

單例設計模式 站物件 印表機物件 python的直譯器獲得物件的引用後,將引用作為第乙個引數,傳遞給 init 方法 重寫 new 方法 的 非常固定!示例 class musicplayer object def new cls,args,kwargs 如果不返回任何結果,return super...