python使用裝飾器實現單例模式

2021-09-17 04:35:12 字數 2106 閱讀 7314

直接上**:

第一種使用函式裝飾器實現並且使用鎖保證執行緒安全:

#不使用鎖實現

def singleinstance(cls):

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

if not hasattr(cls,'instance'):

cls.instance= object.__new__(cls)

return cls.instance

cls.__new__=new

return cls

# 使用鎖實現,確保執行緒安全

from multiprocessing import lock

def singleinstance(cls):

cls.__lock__ = lock()

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

cls.__lock__.acquire()

try:

if not hasattr(cls,'instance'):

cls.instance= object.__new__(cls)

return cls.instance

finally:

cls.__lock__.release()

cls.__new__=new

return cls

#使用類實現

class singleinstance:

def __init__(self,lock=none):

self.lock=lock or lock()

def __call__(self,cls):

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

self.lock.acquire()

try:

if not hasattr(cls, 'instance'):

cls.instance = object.__new__(cls)

return cls.instance

finally:

self.lock.release()

cls.__new__ = new

return cls

使用方法 @singleinstance

@singleinstance

class a:

pass

第二種使用類實現裝飾器:

class singleinstance:

def __init__(self,*args,**kwargs):

self.arg=args

self.kwargs=kwargs

def __call__(self, cls):

def new(cls):

if not hasattr(cls, 'instance'):

cls.instance = object.__new__(cls)

return cls.instance

cls.__new__ = new

return cls

使用方法 @singleinstance(*args,**kwargs)

@singleinstance(*args,**kwargs)

class a:

pass

第三種使用元類實現裝飾器:

class meta(type):

def __call__(self, cls, *args, **kwargs):

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

if not hasattr(cls, 'instance'):

cls.instance = object.__new__(cls)

return cls.instance

cls.__new__ = new

return cls

class singleinstance(metaclass=meta):

pass

使用方法 @singleinstance

@singleinstance

class a:

pass

使用裝飾器實現python單例模式

所謂單例模式就是乙個類只能建立乙個例項化物件,不浪費記憶體,這裡使用裝飾器實現 def singleton cls 定義例項容器 instances 定義巢狀方法 判斷裝飾的類是否單例 if cls not in instances instances cls cls args,kwargs ret...

python裝飾器實現單例模式

基本思想為 1 在裝飾器中新增乙個字典型別的自由變數 instance 2 在閉包中判斷類名是否存在於 instance中,如果不存在則建立乙個類的事例,並講其新增到字典中 如果存在則不進行例項化,直接返回字典中的例項 def singleton cls instance def singleton...

Python裝飾器實現單例模式

coding utf 8 使用裝飾器 decorator 這是一種更pythonic,更elegant的方法,單例類本身根本不知道自己是單例的,因為他本身 自己的 並不是單例的 def singleton cls,args,kw instances def singleton if cls not ...