用裝飾器實現單例模式,應該算乙個很不錯的例子。
我們知道,python中裝飾器無非是對物件的重新包裝,這個物件可以是函式,也可以是乙個類
@decorate
def test():
相當於 test = decorate(test)
def decorate(func):
def wrap(*args,**kwargs):
*****
return
return wrap
不難發現,test其實就是wrap,我們可以在wrap中實現test的邏輯,並新增一些我們想要附加的特性,這樣,相當於將test包裝了一下,也就是『裝飾』了一下
由於類也可以被裝飾,我們以單例模式的實現為例
能想到的辦法一
def single01(cls):
s= //這裡定義了乙個私有列表,也可以宣告乙個變數,在wrap用關鍵字nonlocal去呼叫
def wrap(*args,**kwargs):
if not s:
return s
return wrap
@single01
class a(object):
def __init__(self,name):
self.name = name
//試一下
>>> a = a("tmac")
>>> b = a("kobe")
>>>
>>> a is b
true
也可以寫成將裝飾器寫成類的形式
class single03(object):
def __init__(self,cls):
self._cls = cls
self._instances = none;
def __call__(self,*args):
if not self._instances:
self._instances = self._cls(*args)
return self._instances
//一樣呼叫
@single03
class a(object):
def __init__(self,name):
self.name = name
關於單例模式,有很多更方便的方法,這裡主要用來熟悉下裝飾器
下篇補充下 帶引數的裝飾器 以及functools.wraps
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 ...
python使用裝飾器實現單例模式
直接上 第一種使用函式裝飾器實現並且使用鎖保證執行緒安全 不使用鎖實現 def singleinstance cls def new cls,args,kwargs if not hasattr cls,instance cls.instance object.new cls return cls....