Python 程式設計 單例模式

2022-08-23 12:06:11 字數 2942 閱讀 2905

單例模式(singleton pattern)屬於建立型模式,它提供了一種建立物件的最佳方式。這種模式涉及到乙個單一的類,該類負責建立自己的物件,同時確保只有單個物件被建立,並提供一種訪問其唯一物件的方式。

特點:1.單例類只能有乙個例項

2.單利類必須自己建立自己的唯一例項

3.單例類必須給其他物件提供這一例項

解決問題:

乙個全域性使用的類,頻繁的建立於銷毀。

使用場景:

需要控制例項數目,節省系統資源的時候。

建立方法:

判斷單例類當前是否存在例項,如果有則返回這個例項,沒有就建立

實際用法:

1.建立乙個物件需要消耗過多的資源,比如i/o與資料庫連線等

2.web中的計數器,不用每次重新整理都在資料庫裡加一次,先用單利快取起來

3.執行緒池的設計一般也才有單例模式,方便執行緒控制

4.應用程式的日誌應用,一般都何用單例模式實現,由於共享的日誌檔案一直處於開啟狀態,因為只能有乙個例項去操作,否則內容不好追加。

**實現:

1.使用模組

#

1.使用模組:

"""python 的模組就是天然的單例模式,因為模組在第一次匯入時,會生成 .pyc 檔案,

當第二次匯入時,就會直接載入 .pyc 檔案,而不會再次執行模組**。

因此,我們只需把相關的函式和資料定義在乙個模組中,就可以獲得乙個單例物件了。

"""class

singleton(object):

deffoo(self):

pass

singleton =singleton()

#將上面的**儲存在檔案 mysingleton.py 中,要使用時,直接在其他檔案中匯入此檔案中的物件,這個物件即是單例模式的物件

#from mysingleton import singleton

2.使用元類metaclass

#

2.使用元類metaclass

"""1.類由type建立,建立類時,type的__init__方法自動執行,類例項化,執行type的 __call__方法

2.物件由類建立,建立物件時,類的__init__方法自動執行,物件()執行類的 __call__ 方法

"""class

singleton(type):

"""在元類singleton的__call__方法對類屬性__instance進行判斷,如果__instance為none,

說明類還未進行例項化,那麼呼叫元類的父類(元類是type的子類)type的__call__方法,

同時賦值給 cls.__instance。如果 cls.__instance 不為none,

說明類已經進行過例項化,直接返回之前儲存在類屬性cls.__instance 中的類例項,即實現單例模式。

"""def

__init__(cls, *args, **kwargs):

cls.

__instance =none

super().

__init__(*args, **kwargs)

def__call__(cls, *args, **kwargs):

ifnot cls.__instance

: cls.

__instance = super().__call__(*args, **kwargs)

return cls.__instance

class foo(metaclass=singleton):

pass

foo1 =foo()

foo2 =foo()

print(foo1 is foo2)

3.使用__new__方法

#

3.使用__new__方法

class

singleton(object):

"""當我們例項化乙個物件時,是先執行了類的__new__方法(我們沒寫時,預設呼叫object.__new__),

例項化物件,然後再執行類的__init__方法,對這個物件進行初始化,

所有我們可以基於這個,實現單例模式

"""def

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

ifnot hasattr(cls, '

_instance

'): #

關鍵在於每一次例項化,我們都返回這同乙個_instance物件

cls._instance = super().__new__

(cls)

return

cls._instance

class

foo(singleton):

def__init__

(self):

pass

foo1 =foo()

foo2 =foo()

print(foo2 is foo1)

4.使用裝飾器

#

4.使用裝飾器

defsingleton(cls):

instance ={}

def get_singleton(*args, **kwargs):

if cls not

in instance: #

判斷是否存在字典中

instance[cls] = cls(*args, **kwargs) #

這裡相當於foo()

return

instance[cls]

return

get_singleton

@singleton

class

foo:

pass

foo1 =foo()

foo2 =foo()

print(foo1 is foo2)

程式設計模式 單例模式

由於例項化是在初始化階段執行的,所以沒有執行緒安全的問題,但是潛在問題在於no local static物件 函式外的static物件 在不同編譯單元 可理解為cpp檔案和其包含的標頭檔案 中的初始化順序是未定義的。如果在初始化完成之前呼叫 instance 方法會返回乙個未定義的例項。例如有兩個單...

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

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

單例模式 python

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