設計模式之單例模式(Python實現)

2021-09-24 04:20:43 字數 3531 閱讀 2311

class

person

:def

__init__

(self, name)

: self.name = name

p1 = person(

'zyp'

)p2 = person(

"zyp"

)print

(p1.name, p2.name)

print

(p1)

print

(p2)

print

(p1 is p2)

zyp zyp

<__main__.person object at 0x000001a250fc6390>

<__main__.person object at 0x000001a250fc6320>

false

class

player

(object):

def__new__

(cls,

*args,

**kwargs)

:print

("__new__方法被呼叫,為物件分配記憶體空間"

)return

super()

.__new__(cls)

def__init__

(self)

:print

("__init__例項化物件"

)

player = player(

)# __new__方法不返回內容,

class

error

(object):

def__new__

(cls,

*args,

**kwargs)

:print

("__new__方法被呼叫"

)def

__init__

(self)

:print

("__init__方法被呼叫"

)e = error(

)

__new__方法被呼叫,為物件分配記憶體空間

__init__例項化物件

__new__方法被呼叫

# 1. 判斷類屬性是否為none

# 2. 呼叫父類方法,為第乙個物件分配記憶體空間

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

class

player

(object):

instance =

none

def__new__

(cls,

*args,

**kwargs)

:if cls.instance is

none

: cls.instance =

super()

.__new__(cls)

return cls.instance

player1 = player(

)player2 = player(

)print

(player1)

print

(player2)

<__main__.player object at 0x000001a250fc6240>

<__main__.player object at 0x000001a250fc6240>

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

# 初始化方法被呼叫了兩次

# 第二次呼叫的初始化方法會修改第一次初始化的值,因為他們的記憶體位址是一樣的

class

player

(object):

instance =

none

def__new__

(cls,

*args,

**kwargs)

:if cls.instance is

none

: cls.instance =

super()

.__new__(cls)

return cls.instance

def__init__

(self, name)

: self.name = name

p1 = player(

'111'

)print

(p1.name)

p2 = player(

'222'

)print

(p1.name)

print

(p2.name)

111

222222

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

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

然後將 init_flag 設定為 true

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

class

player

(object):

instance =

none

init_flag =

false

def__new__

(cls,

*args,

**kwargs)

:if cls.instance is

none

: cls.instance =

super()

.__new__(cls)

return cls.instance

def__init__

(self, name)

:# 如果已經初始化過,則直接返回

# 沒有初始化則將進行初始化,並將初始化標記置為true

if self.__class__.init_flag ==

true

:return

else

: self.name = name

self.__class__.init_flag =

true

# 初始化方法只呼叫一次

# 只記錄第一次初始化的值

p1 = player(

'111'

)print

(p1.name)

p2 = player(

'222'

)print

(p1.name)

print

(p2.name)

111

111111

**站 物件

印表機 物件

Python設計模式之單例模式

站 物件 印表機 物件 使用類名 建立物件時,python 的直譯器首先 會 呼叫 new 方法為物件 分配空間。new 是乙個 由object基類提供的內建的靜態方法,主要作用有兩個 python 的直譯器獲得物件的 引用 後,將引用作為 第乙個引數,傳遞給 init 方法。重寫 new 方法 的...

python設計模式之單例模式

單例模式是一種建立型設計模式,它確保乙個類有且只有乙個特定型別的物件,並提供全域性訪問點。其意圖為 簡單理解 單例即為單個例項,也就是每次例項化建立物件時獲得的都是同乙個物件,當然同乙個物件的屬性都是相同的,方法也是相同的,位址也是相同的,這樣給我們帶來的好處就是可以避免消耗過多的記憶體或cpu資源...

Python設計模式之單例模式

單例模式屬於建立型模式,它提供了一種建立物件的最佳方式。這種模式涉及到乙個單一的類,該類負責建立自己的物件,同時確保只有單個物件被建立。這個類提供了一種訪問其唯一的物件的方式,可以直接訪問,不需要例項化該類的物件。單例模式是獲取全域性狀態的一種相當好的方法,但這也是對於單例模式的主要批評之處,因為在...