1. 程式人生 > >python 單例模式----裝飾器實現

python 單例模式----裝飾器實現

1、閉包的實現

#coding:utf-8
def A():
    s1=2
    def B():
        sum1=s1+2
        return sum1
    return B

if __name__ == '__main__':
    f1=A()
    f2=f1()
    print 'f1: ',f1
    print 'f2: ',f2
輸出:
f1:  <function B at 0x02BDEB30>
f2:  4

可以看出f1為一個函式,呼叫這個函式時,才會返回值

閉包可以使得內函式返回的區域性變數的生命週期與整個專案相同,即sum1會一直保留到整個工程執行結束,而不是這個函式執行完。

2、python 裝飾器

def fun1(fun):
    print 'fun1 action'
    return fun

@fun1    
def fun2():
    print 'fun2 action'
    
if __name__ == '__main__':
    fun2()
輸出:
fun1 action
fun2 action
@fun1的功能:實際上是將fun2作為引數傳遞fun1再進行執行

3、裝飾器+閉包實現單例模式

單例模式:顧名思義,一個類,在整個專案的執行週期內只有一個例項

實現:

def singleton(cls, *args, **kw):
    instance={}
    def _singleton():
        if cls not in instance:
            instance[cls]=cls(*args, **kw)
        return instance[cls]
    return _singleton

@singleton
class test_singleton(object):
    def __init__(self):
        self.num_sum=0
    def add(self):
        self.num_sum=100
輸出:
<__main__.test_singleton object at 0x023F6AD0>
<__main__.test_singleton object at 0x023F6AD0>
可以看出,雖然進行了兩次例項化,但仍為同一個例項
不使用單例模式時:
class test_singleton(object):
    def __init__(self):
        self.num_sum=0
    def add(self):
        self.num_sum=100
    
if __name__ == '__main__':
    cls1= test_singleton()
    cls2= test_singleton()
    print cls1
    print cls2
輸出:
<__main__.test_singleton object at 0x022569F0>
<__main__.test_singleton object at 0x02256A10>
顯然,此時為兩個不同的例項

至於單例模式在python中的作用,我第一次使用,是因為傳參傳了太多層,以至於我找不到引數是哪裡來的了(傳參為類),可是如果把傳的引數設定成單例模式,便可以直接在程式中直接使用該類的成員變數,通過類名().變數名的形式,而不需要再進行引數傳遞,資料是從哪裡來的,也一目瞭然,感覺比較方便。

另:python中的單例模式還有其他多種實現方式,個人覺得這種最容易理解,至於使用單例模式的缺點暫時還沒研究,有了解的還望不吝賜教O(∩_∩)O

----------------------python學習筆記-----------------------------------