国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

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

2019-11-14 17:42:49
字體:
來源:轉載
供稿:網友

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。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 成武县| 彩票| 且末县| 平利县| 高碑店市| 利川市| 古丈县| 江城| 茶陵县| 九龙县| 大安市| 怀远县| 合山市| 芜湖县| 凤城市| 永福县| 凤台县| 罗城| 大田县| 南宫市| 麻栗坡县| 环江| 汪清县| 合川市| 丽江市| 宣汉县| 乌苏市| 留坝县| 榆树市| 新昌县| 全南县| 巩义市| 棋牌| 柏乡县| 云林县| 沾益县| 泗阳县| 皮山县| 塘沽区| 威宁| 大厂|