用python實現單例模式的幾種方法

2021-10-09 02:04:27 字數 1396 閱讀 5307

# 使用__new__方法,python自省

class singleton(object):

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

# 如果沒有隱變數_instance就呼叫__new__乙個,python自省

if not hasattr(cls, "_instance"):

orig = super(singleton, cls)

cls._instance = orig.__new__(cls, *args, **kwargs)

return cls._instance

利用hasattr反射技術,判斷是否有_instance屬性,沒有則呼叫object的__new__方法建立乙個物件賦值給私有變數

讓需要單例模式的類繼承該類即可

# 繼承該單例模式

class myclass(singleton):

pass

利用閉包定義乙個裝飾器

# 裝飾器版本

def singletondecor(cls):

# 儲存物件例項的字典

instance = {}

def getinstance(*args, **kwargs):

if cls not in instance.keys():

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

return getinstance

判斷定義的類是否是在存在物件例項的字典中,不存在則建立乙個物件

@singletondecor

class mytest3():

pass

在需要單例的類上新增裝飾器即可

# 執行緒安全的單例模式

from functools import wraps

from threading import rlock

def singleton(cls):

"""執行緒安全的單例裝飾器"""

instances = {}

locker = rlock()

@wraps(cls)

if cls not in instances:

with locker:

if cls not in instances:

instances[cls] = cls(*args, **kwargs)

return instances[cls]

引入rlock,在建立物件的時候加鎖,@wraps(cls)的作用是保證被裝飾器修飾的函式的結構不變,比如可以保證裝飾器修飾的函式的__name__的值保持不變等

python實現單例模式

最近在寫乙個連線池,而連線池管理類不可避免的需要使用單例來保證所有使用者在取得連線時取到的一定是同乙個管理物件。故將此模式取來研究一番。保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點 設計模式 單例模式是全域性只有乙個訪問點,故對於乙個類來說,任何例項化後訪問到的都應該是同樣的物件。而也有另...

Python 實現單例模式

encoding utf 8 print 方法1 方法1,實現 new 方法 並在將乙個類的例項繫結到類變數 instance上,如果cls.instance為none說明該類還沒有例項化過,例項化該類,並返回 如果cls.instance不為none,直接返回cls.instance class ...

python實現單例模式

單例模式,簡單來說,就是乙個類只能有乙個例項,並且能夠自行例項化向整個系統提供。例如檔案系統和任務管理器等。由此可見,單例模式的要點有三個 1.乙個類只能有乙個例項 2.它必須自行建立這個例項 3.它必須自行向整個系統提供這個例項 在python實現單例模式的方法總結起來有四種及其對應 如下 1.魔...