單例設計模式

2021-10-08 14:54:42 字數 2335 閱讀 8463

讓 類 建立的物件,在系統中 只有唯一的乙個例項(每一次通過類建立的物件的記憶體位址是一樣的)

當我們通過類來建立物件時,python的直譯器首先會呼叫__new__方法為物件分配空間

__new__是乙個 由object基類提供的內建的靜態方法,主要作用有兩個:

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

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

如果要得到當前類的例項,應當在當前類中的__new__()方法語句中呼叫當前類的父類的__new__()方法。

例如,如果當前類是直接繼承自object,那當前類的__new__()方法返回的物件應該為:

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

...return object.__new__(cls)

注意:

單例 —— 讓 類 建立的物件,在系統中 只有 唯一的乙個例項

class student:

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

instance = none

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

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

if cls.instance is none:

# 為單例物件分配空間

cls.instance = object.__new__(cls)

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

return cls.instance

def __init__(self, name, age):

self.name = name

self.age = age

student1 = student('小明', 18)

student2 = student('小紅', 19)

增加需求:使得 讓初始化動作只執行一次在每次使用 類名() 建立物件時,python 的直譯器都會自動呼叫兩個方法:

__new__分配空間

__init__物件初始化

上面的**對__new__方法改造之後,每次都會得到 第一次被建立物件的引用

但是:初始化方法還會被再次呼叫

解決辦法

class student:

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

instance = none

init_flag = false

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

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

if cls.instance is none:

# 為單例物件分配空間

cls.instance = object.__new__(cls)

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

return cls.instance

def __init__(self, name, age):

if not student.init_flag:

self.name = name

self.age = age

student.init_flag = true

student1 = student('小明', 18)

student2 = student('小紅', 19)

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

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

設計模式 單例設計模式

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

設計模式 單例設計模式

單例模式,是一種常用的軟體設計模式。在它的核心結構中只包含乙個被稱為單例的特殊類。通過單例模式可以保證系統中乙個類只有乙個例項。即乙個類只有乙個物件例項 單例模式的要點有三個 一是某個類只能有乙個例項 二是它必須自行建立這個例項 三是它必須自行向整個系統提供這個例項。單例設計模式 解決的問題 可以保...