認識單例模式 new init

2021-09-02 05:42:58 字數 2867 閱讀 9168

讓類的例項在系統中只有乙個唯一的例項,每一次執行 類名()返回 的物件,記憶體位址相同。

單例設計模式的使用場景:

**站物件

印表機物件

__new__ 的執行順序是在__init__之前,因為__new__執行的是類方法所以在__init__之前,__new__要先分配記憶體空間給物件,然後再把物件的引用給__init__方法。

class singleton(object):

def __init__(self,*args,**kwargs):

print("__init__")

@classmethod

def instance(cls, *args, **kwargs):

if not hasattr(singleton, "_instance"):

print("instance")

singleton._instance = singleton(*args, **kwargs)

return singleton._instance

singleton.instance(())

instance

__init__

class musicplayer:

def __new__(cls, *args, **kwargs):

print("__new__")

def __init__(self):

print("__init__")

player1 = musicplayer()

__new__
如果不把物件引用返回給__init__則只會執行__new__方法,所以把物件引用返回給__init__.

要想建立單例則必須重寫__new__方法。

要記住這個流程:

先判斷有之前有沒有建立例項物件,如果有則繼續用這個例項物件的記憶體的位址,沒有則在記憶體中開闢乙個空間給這個第一次建立的例項物件。

instance = none#物件

def __new__(cls, *args, **kwargs):

if cls.instance is none:#判斷類屬性是否為空物件

cls.instance = super().__new__(cls)#如果是空則呼叫父類方法,為第乙個物件建立記憶體空間

return cls.instance#返回類屬性儲存的物件引用給__init__

def __init__(self):

player1 = musicplayer()

print(player1)

player2 = musicplayer()

print(player2)

<__main__.musicplayer object at>

<__main__.musicplayer object at>

重寫__new__方法後,建立的物件都指向唯一乙個記憶體位址。

單例只初始化一次:

就是在設定乙個類屬性init_flag = false,在__init__方法下判斷init_flag是否為true,如果是true則return non,不是就執行第一次初始化的函式,在把init_flag = true。

class musicplayer:

instance = none#

init_flag = false

def __new__(cls, *args, **kwargs):

if cls.instance is none:#判斷類屬性是否為空物件

cls.instance = super().__new__(cls)#如果是空則呼叫父類方法,為第乙個物件建立記憶體空間

return cls.instance#返回類屬性儲存的物件引用給__init__

def __init__(self):

if musicplayer.init_flag == true:

return

musicplayer.init_flag = true

<__main__.musicplayer object at>

<__main__.musicplayer object at>

認識單例模式

保證整個系統中乙個類只有乙個物件的例項,實現這種功能的方式就叫單例模式。1 單例模式節省公共資源 比如 大家都要喝水,但是沒必要每人家裡都打一口井是吧,通常的做法是整個村里打乙個井就夠了,大家都從這個井裡面打水喝。對應到我們計算機裡面,像日誌管理 印表機 資料庫連線池 應用配置。2 單例模式方便控制...

認識設計模式(一) 單例模式(1)

四 優缺點分析 五 總結 餓漢式 靜態常量 餓漢式 靜態 塊 懶漢式 執行緒不安全 懶漢式 執行緒安全,同步方法 懶漢式 執行緒安全,同步 塊 雙重檢查靜態內部類列舉構造器私有化 防止new再獲取物件 類的內部建立物件 向外暴露乙個靜態的公共方法,getinstance,這個唯一的方法用來獲取物件例...

單例模式 單例模式

餓漢式 急切例項化 public class eagersingleton 2.宣告靜態成員變數並賦初始值 類初始化的時候靜態變數就被載入,因此叫做餓漢式 public static eagersingleton eagersingleton new eagersingleton 3.對外暴露公共的...