python 單例 Python單例

2021-10-13 08:02:21 字數 2324 閱讀 4038

01. 單例設計模式

設計模式

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

使用 設計模式 是為了可重用**、讓**更容易被他人理解、保證**可靠性

單例設計模式

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

每一次執行 類名() 返回的物件,記憶體位址是相同的

單例設計模式的應用場景

**站 物件

印表機 物件

02. __new__ 方法

使用 類名() 建立物件時,python 的直譯器 首先 會 呼叫 __new__ 方法為物件 分配空間

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

1) 在記憶體中為物件 分配空間

2) 返回 物件的引用

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

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

重寫 __new__ 方法 一定要 return super().__new__(cls)

否則 python 的直譯器 得不到 分配了空間的 物件引用,就不會呼叫物件的初始化方法

注意:__new__ 是乙個靜態方法,在呼叫時需要 主動傳遞 cls 引數

示例**

class musicplayer(object):

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

# 如果不返回任何結果,

return super().__new__(cls)

def __init__(self):

player = musicplayer()

print(player)

03. python 中的單例

單例 —— 讓 類 建立的物件,在系統中 只有 唯一的乙個例項定義乙個 類屬性,初始值是 none,用於記錄 單例物件的引用

重寫 __new__ 方法

如果 類屬性 is none,呼叫父類方法分配空間,並在類屬性中記錄結果

返回 類屬性 中記錄的 物件引用

class musicplayer(object):

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

instance = none

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

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

if cls.instance is none:

cls.instance = super().__new__(cls)

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

return cls.instance

只執行一次初始化工作

在每次使用 類名() 建立物件時,python 的直譯器都會自動呼叫兩個方法:

__new__ 分配空間

__init__ 物件初始化

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

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

需求讓 初始化動作 只被 執行一次

解決辦法

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

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

然後將 init_flag 設定為 true

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

class musicplayer(object):

# 記錄第乙個被建立物件的引用

instance = none

# 記錄是否執行過初始化動作

init_flag = false

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

# 1. 判斷類屬性是否是空物件

if cls.instance is none:

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

cls.instance = super().__new__(cls)

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

return cls.instance

def __init__(self):

if not musicplayer.init_flag:

musicplayer.init_flag = true

# 建立多個物件

player1 = musicplayer()

print(player1)

player2 = musicplayer()

print(player2)

python單例模式繼承 python單例模式

我們可以使用 new 這個特殊方法。該方法可以建立乙個其所在類的子類的物件。更可喜的是,我們的內建 object 基類實現了 new 方法,所以我們只需讓 sing 類繼承 object 類,就可以利用 object 的 new 方法來建立 sing 物件了。classsing object def...

python手寫單例 Python實現單例模式

語言是共通的,想要用不同語言實現單例模式,首先要清楚什麼是單例模式,單例模式即乙個類有且僅有乙個例項,那麼通過python怎麼實現乙個類只能有乙個例項呢。首先先建立乙個類,比如宇宙只有乙個地球 class earth pass a earth print id a b earth print id ...

單例模式 python

單例模式 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。實現 某個類只有乙個例項 途徑 1 讓乙個全域性變數使得乙個物件被訪問,但是它不能防止外部例項化多個物件。2 讓類自身負責儲存它的唯一例項。這個類可以保證沒有其他例項可以被建立。即單例模式。多執行緒時的單例模式 加鎖 雙重鎖定。餓漢式...