單例設計模式的練習

2021-07-30 11:34:07 字數 1982 閱讀 8482

單例設計模式

有關的知識點

class

a(object):

def__init__

(self):

print("這是 init 方法")

def__new__

(cls):

print("這是 new 方法")

return object.__new__(cls) #返回的是乙個例項了的物件 就是self

__new__至少要有乙個引數cls,代表要例項化的類(一般就是本類),此引數在例項化時由python直譯器自動提供

__new__必須要有返回值,返回例項化出來的例項,這點在自己實現__new__時要特別注意,

可以return父類__new__出來的例項(父類沒有自己實現的話還是會去找基類的),或者直接是object的__new__出來的例項

__init__有乙個引數self,就是這個__new__返回的例項,__init__在__new__的基礎上可以完成一些其它初始化的動作,__init__不需要返回值

# 例項化乙個單例

class

singleton

(object):

__instance = none

# 私有類的屬性(就是私有了乙個類的物件)

def__new__

(cls, age, name):

# 這個方法會返回乙個物件 就是self物件

# 如果類屬性中是否指向了乙個物件 如果沒有

# 那麼就建立乙個物件,並且賦值為這個物件的引用,保證下次呼叫這個方法時

# 能夠知道之前已經建立過物件了,這樣就保證了只有1個物件

ifnot cls.__instance: # 判斷類的屬性是否存在

cls.__instance = object.__new__(cls) # 不能存在就建立乙個類的是例項物件

return cls.__instance # 返回類的例項物件

保證單例的設計模式只能初始化一次

如果只是簡簡單單的完成了類的單例 那麼當去建立乙個物件並呼叫init(self) 方法的時候 當建立多個物件 並初始化多次的時候 最後初始化的屬性

會覆蓋前面初始化過的屬性,為了防止多次的初始化 我們可以在初始化中在加一層判斷

class

demo:

__instance=none

# 用於單例建立時物件的賦值和引用

__flag=false

# 用於控制初始化時的判斷

def__new__

(cls,*args):

ifnot cls.__instance: # 判斷物件是否存在

cls.__instance=object.__new__(cls) # 把建立的物件賦值給 類的屬性

return cls.__instance # 返回建立的物件

def__init__

(self,name):

ifnot demo.__falg: # 判斷標誌位

self.name=name # 初始化物件的屬性值

demo.__falg=true

# 設定標誌位 這樣當下次再建立物件的時候就不會在進行初始化操作了

demo=demo("haha")

print(id(demo)) # 列印物件的記憶體位址

print(demo.name) # 列印屬性

# 建立物件2

denmo2=demo("hehe")

print(id(demo2)) # 列印物件的記憶體位址

print(demo2.name) # 列印屬性

結果:139798882285720

haha

139798882285720

haha

單例設計模式程式設計練習

單例設計模式 是指在程式的執行過程中,只有乙個例項的存在。同乙個類的若干物件需要訪問同乙個資料,這個資料儲存在靜態變數中 如果不同的類的若干物件訪問同乙個資料,其中乙個解決方案就是單例。把構造方法私有化 在類中提供乙個私有的靜態的本類的物件 提供乙個公共的靜態的方法,返回這個物件 singleton...

單例設計模式(餓漢單例設計模式 懶漢單例設計模式)

1.什麼是單例 單例的意思是乙個類永遠只存在乙個物件,不能建立多個物件。2.為什麼要用單例 開發中有很多的物件我們只需要乙個,例如虛擬機器物件,任務管理器物件 物件越多越佔記憶體,有時候只需要乙個物件就可以實現業務,單例可以節省記憶體空間。3.如何實現單例 單例的實現方式有 餓漢單例設計模式 通過類...

設計模式 單例設計模式

歷史 最早是建築學領域的模式,然後gof四人由其引申到編碼方面,總結了23種設計模式 設計模式 解決某一類事情最行之有效的方法 2.1 體現 餓漢式,保證物件的唯一性 class singleton 私有化建構函式禁止該類建立物件 private static singleton st new si...