@修飾符--python中的裝飾器

裝飾器模式可以在不影響其他對象的情況下,以動態、透明的方式給單個對象添加職責,也能夠處理那些可以撤銷的職責。經常用於日誌記錄、性能測試等場合。

想象一下這個很常見的場景,你寫了一個方法只提供給以登陸的用戶訪問(事實上我也是通過django的@login_required才瞭解到@修飾符的),你可以寫以下代碼:

def A():  
    if user.is_login():  
        do something  
    else:  
        pass


這當然沒什麼問題,但是你又寫了一個方法B,也要求只有登錄用戶可以訪問,於是有寫了以下代碼:

def B():  
    if user.is_login():  
        do something  
    else:  
        pass


問題出來了,你在複製粘貼,如果不是兩個方法而是一堆方法,你可能就有點受不了啦。當然聰明的你可以想出這個方法:

def A():
    pass
def B():
    pass
def login_required(fn):
    def ff():
        if user.is_login():
            fn()
        else:
            pass
    return ff
A = login_required(A)
B = login_required(B)

你可能沒有想到,對於這麼好用的東西,python優雅的支持,這就是@修飾符


def login_required(fn):
    def ff():
        if user.is_login():
            fn()
        else:
            pass
    return ff
@login_required
def A():
    pass
@login_required
def B():
    pass

在方法A上邊寫一個@修飾符,調用方法A的時候會調用修飾符後邊的方法B,方法B以A方法爲參數,而且需要返回一個可調用的對象,這個可調用的對象會使用A方法提供的參數執行。看這個例子:


#!/usr/bin/env python
def a(fn):
    print 'a'
    def d(st):
        print st+'d'
    return d
def b(fn):
    print 'b'
    return fn
@a
@b
def c(st):
    print st
    
c('c')

輸出結果:bacd

我們調用c('c')的時候會先調用b(c),b(c)打印字符"b"然後返回c,然後再調用a(c),a(c)打印字符"a",然後返回方法d,然後再執行d('c'),打印cd。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章