1. 程式人生 > >python單例設計模式

python單例設計模式

設計模式

設計模式是前人的總結和經驗的提煉,通常被人們廣為流傳的設計模式都是針對某一特定問題的成熟解決方案

單例設計模式

單例:讓類建立的物件,在系統中有唯一的例項

我們在建立物件的時候;
1.為物件分配空間: new
建立物件的時候,python直譯器首先會呼叫 __new__方法為物件分配空間
__new__方法是一個由object基類提供的內建的靜態方法,主要有兩個作用,
在記憶體中為物件分配空間,返回物件的引用

2.物件初始化: init
python直譯器獲得物件的引用後,將引用的第一個引數傳遞給__init__方法
為物件分配空間
重寫__new__方法

重寫__new__方法的程式碼非常固定
    繼承自父類方法
    返回父類方法呼叫__new__方法的結果
重寫__new__方法一定要return object.__new__(cls)
否則python直譯器得不到分配了空間的物件引用,就不會呼叫物件的初始化方法

在這裡插入圖片描述

可以看到以上方法建立的物件的記憶體地址不同,為了節省記憶體空間可以修改一下__new__方法,使建立的兩個物件的記憶體地址空間相同
在這裡插入圖片描述

python中的單例
單例:讓類建立的物件,在系統中只有唯一的一個例項
1.定義一個類屬性,初始值是None,用於記錄單例物件的引用(因為當一個類
定義完成執行程式的時候,記憶體中有這個類建立的物件嗎?
並沒有,我們需要呼叫建立物件的方法,記憶體中才會有第一個物件)
2.重寫__new__方法
3.如果類屬性is None,呼叫父類方法分配空間,並在類屬性中記錄結果
4.返回類屬性中記錄的物件的引用

只執行一次__init__方法
只執行一次初始化方法
在每次使用 類名() 建立物件時,python的直譯器會自動呼叫兩個方法
new

分配空間
init 物件初始化
但在上一小節中 __new__方法改造之後,每次都會得到第一被建立物件的引用
但是初始化方法還是會被再次用掉

需求:讓初始化方法只執行一次
解決辦法:
1.定義一個類屬性init_flag標記是否執行過初始化動作,初始值為False
2.在__init__方法中,判斷init_flag,如果為False就執行初始化動作
3.然後將init_flag設定為True
4.這樣,再次自動呼叫__init__方法時,初始化動作就不會再次被執行了
在這裡插入圖片描述

相關推薦

Python 設計模式

如果 main https 需要 對象的引用 參數 .cn 理解 基類 設計模式 設計模式是前人工作的總結和提煉,通常,被人們廣泛流傳的設計模式都是針對某一特定問題的成熟解決方案 使用設計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性 單例設計模式 目的

Python:設計模式

1.單例模式的設計 設計模式                 設計模式是前人工作的總結和提煉,通常被人們廣泛流傳的設計模式都是針對某一特定問題的成熟解決方法,相當於針對                  某一問題已經有了解決套路,我們只需要知道套路即可          

python設計模式

設計模式 設計模式是前人的總結和經驗的提煉,通常被人們廣為流傳的設計模式都是針對某一特定問題的成熟解決方案 單例設計模式 單例:讓類建立的物件,在系統中有唯一的例項 我們在建立物件的時候; 1.為物件分配空間: new 建立物件的時候,python直譯器首先會

python中的設計模式

init 創建對象 播放器 start rgs false 獲得 bject 內置 目標 單例設計模式 __new__ 方法 Python 中的單例 01. 單例設計模式 設計模式 設計模式 是 前人工作的總結和提煉,通常,被人們廣泛流傳的設計模式都是

python基礎之設計模式

ins code return 設計 flag pla int layer als class Player(): instance = None init_flag = False def __init__(self): if

python小總結3(異常、設計模式

一、異常 AttributeError:試圖訪問一個物件沒有的成員【屬性和方法】 ValueError:值錯誤,傳入了一個不期望的值 ImportError:無法匯入模組或者包:基本上路徑問題 IndexError:訪問了不在範圍內的索引 KeyError:試圖訪問字典中不存在的鍵 NameErr

python中的__new__方法和設計模式

#1. __new__方法 # 建立物件(__new__) =》 初始化物件(__init__) class Car(object): #__new__方法是類方法 def __new__(cls,*args,**kwargs): print('

python設計模式、異常

一、單例設計模式 1、 設計模式 設計模式是前人的總結和經驗的提煉,通常被人們廣為流傳 2、單例 由類建立的物件,在系統中有唯一的例項 3、建立物件的步驟 (1)為物件分配空間:__new__() 建立物件的時候,python直譯器首先會呼叫__new__方法

python設計模式

動作 font 初始 記錄 sta pan dash sicp rgs 1. 定義 目的——讓類創建的對象,在系統中只有唯一的實例。 每一次執行新建對象操作,返回的都是同一個對象。 2. __new__ 方法   使用 classna

設計模式

機制 構造方法 出錯 保持 什麽 方法 交易 註意 let 這是一種常見常說的設計模式 餓漢式 懶漢式 其核心思想是: 保證在一個JVM中只有一個實例對象 好處: 1.針對於某些類的創建比較頻繁,對於一些很大的對象來說系統開銷很大 2.節省new 操作符,降低內存使用頻

java軟件設計模式——設計模式中的【餓漢式】與 【懶漢式】示例

nal pre turn new對象 構造方法 sta 餓漢式 () urn 以下為單例設計模式中的兩種經典模式的代碼示意: 1 單例設計模式(spring框架IOC,默認創建的對象都是單例的): 2 餓漢式: 3 public class Sing

java的設計模式(對象的延時加載)考試專用

clas pac ack 延時加載 專用 public get private static java的單例設計模式(對象的延時加載) ,稱為:懶漢式 考試專用例:package day6;public class Single2 { //考試專用 ,對象的延時加

五、設計模式

println pre log 內存 urn args 懶漢 logs pan /* 設計模式:解決某一類問題最有效的方式 單例設計模式:解決的是一個類在內存中只有一個對象的問題 1:構造方法私有化 2:構造方法私有化之後,一個對象都不能創建了,所以只能在類中創建對

設計模式設計模式

javaSINGLETON(單件)—對象創建型模式1. 意圖 保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。2. 動機 對一些類來說,只有一個實例是很重要的。雖然系統中可以有許多打印機,但卻只應該有一個打印假脫機(printer spooler),只應該有一個文件系統和一個窗口管理器。一個

java的設計模式

一個 pre 成員變量 餓漢式 設計 單例模式 建立 單例設計模式 線程 單例設計模式是java的一種設計模式,它是指在設計一個類時,要保證在整個程序運行期間針對該類內存中只存在一個實例對象。 單例設計模式包括餓漢式和懶漢式兩種模式。 餓漢式:

JAVA-初步認識-第八章-設計模式-概述體現

產生 比較 23種設計模式 設計 兩種 數據類型 計算機 一個 java (本節講述的知識點,有像更新,一個變化,另一個也同時變化) 一. 接下來是比較重要的一部分知識點-設計模式。 設計模式的定義,從字面來看就是設計時的統一規範。 java有23種設計模式,也可以用於C

5.設計模式

斷開 沒有 有一個 查看 餓漢 sync 線程池 即使 是否  為什麽需要單例設計模式?   我們在系統設計的時候,出於對性能,或者安全性等多種因素考慮,有些對象我們只需要一個。可能是全局只需要一個,也可能是整個系統只需要一個。     這個時候我們就需要用到單例模式了。比

設計模式--設計模式

加載 唯一性 多個 其他 構造函數 .get 安全 ret 多線程 設計模式是對問題行之有效的解決方案,它其實是一種思想。 單例設計模式:   解決的問題:可以保證一個類在內存中只能有一個對象。(比如多個程序使用相同的配置信息對象時,就需要保證對象的唯一性)   如何保

對象初始化過程與設計模式(餓漢式與懶漢式)

得到 延時 兩個 都是 person 其他 導致 最大 類屬性 1.對象初始化過程:(先加載類到內存,然後加載類屬性,成員方法)    定義一個類Person, 在new Person("zhangsan",20); 初始化過程: 因為new 用到Person.clas

構造私有化和設計模式

靜態方法 內部 size 外部 定義 oid data 常用 out 以下的代碼對構造方法進行了私有化封裝,但這樣封裝後我們在類外需要實例化對象是會出現錯誤,因為構造方法是私有的,所以無法實例化。 1 class Singleton{ 2 private Sing