http://blog.csdn.net/shangzhihaohao/article/details/6928808
裝飾器模式可以在不影響其他對象的情況下,以動態、透明的方式給單個對象添加職責,也能夠處理那些可以撤銷的職責。經常用于日志記錄、性能測試等場合。
想象一下這個很常見的場景,你寫了一個方法只提供給以登陸的用戶訪問(事實上我也是通過django的@login_required才了解到@修飾符的),你可以寫以下代碼:
這當然沒什么問題,但是你又寫了一個方法B,也要求只有登錄用戶可以訪問,于是有寫了以下代碼:
def B(): if user.is_login(): do something else: pass
問題出來了,你在復制粘貼,如果不是兩個方法而是一堆方法,你可能就有點受不了啦。當然聰明的你可以想出這個方法:
def A(): passdef B(): passdef login_required(fn): def ff(): if user.is_login(): fn() else: pass return ffA = login_required(A)B = login_required(B)
你可能沒有想到,對于這么好用的東西,python優雅的支持,這就是@修飾符
def login_required(fn): def ff(): if user.is_login(): fn() else: pass return ff@login_requireddef A(): pass@login_requireddef B(): pass
在方法A上邊寫一個@修飾符,調用方法A的時候會調用修飾符后邊的方法B,方法B以A方法為參數,而且需要返回一個可調用的對象,這個可調用的對象會使用A方法提供的參數執行。看這個例子:
#!/usr/bin/env pythondef a(fn): PRint 'a' def d(st): print st+'d' return ddef b(fn): print 'b' return fn@a@bdef c(st): print st c('c')
輸出結果:bacd
我們調用c('c')的時候會先調用b(c),b(c)打印字符"b"然后返回c,然后再調用a(c),a(c)打印字符"a",然后返回方法d,然后再執行d('c'),打印cd。
新聞熱點
疑難解答