站長(zhǎng)資訊網(wǎng)
        最全最豐富的資訊網(wǎng)站

        python中的函數(shù)裝飾器解析

        一、函數(shù)裝飾器

        1、函數(shù)裝飾器的定義:

        裝飾器的實(shí)現(xiàn)是函數(shù)里面嵌套函數(shù)
        在不改變?cè)瘮?shù)的基礎(chǔ)上,給函數(shù)增加功能",把一個(gè)函數(shù)當(dāng)作參數(shù),返回一個(gè)替代版的函數(shù)
        本質(zhì)上:返回函數(shù)的函數(shù)

        裝飾器需要傳遞一個(gè)函數(shù), 返回值也是一個(gè)函數(shù)對(duì)象.

        示例1:調(diào)用新函數(shù)

        如下outer函數(shù)就是一個(gè)裝飾器,func是形參接收的一個(gè)函數(shù),inner是返回的函數(shù)

        python中的函數(shù)裝飾器解析

        示例2:

        python中的函數(shù)裝飾器解析

        2、語法糖:@+裝飾器函數(shù)名(@desc)

        使用裝飾器來裝飾一個(gè)函數(shù),只需要在開頭加上@+裝飾器函數(shù)名就可以

        python中的函數(shù)裝飾器解析

        運(yùn)行結(jié)果如下:

        python中的函數(shù)裝飾器解析

        3、導(dǎo)入string模塊,使得我們可以調(diào)用與字符串操作相關(guān)的函數(shù)

        python中的函數(shù)裝飾器解析

        4、裝飾器需求:獲取每個(gè)函數(shù)的執(zhí)行時(shí)間
        1.函數(shù)執(zhí)行之前計(jì)算時(shí)間
        2.函數(shù)執(zhí)行之后計(jì)算時(shí)間

        導(dǎo)入random模塊和string模塊,來生成100個(gè)大寫或小寫字母為元素組成的列表

        python中的函數(shù)裝飾器解析

        運(yùn)行結(jié)果如下:

        python中的函數(shù)裝飾器解析

        問題1:被裝飾的函數(shù)有返回值的時(shí)候怎么辦?

        python函數(shù)返回值return,函數(shù)中一定要有return才是完整的函數(shù)

        #接收被裝飾函數(shù)的返回值
        res = fun(*args,**kwargs)
        return res

        python中的函數(shù)裝飾器解析

        運(yùn)行結(jié)果為:

        python中的函數(shù)裝飾器解析

        問題2:如何保留被裝飾函數(shù)的函數(shù)名和幫助文檔信息

        導(dǎo)入import functools模塊來保留被裝飾函數(shù)的函數(shù)名和幫助文檔信息

        python中的函數(shù)裝飾器解析

        運(yùn)行結(jié)果如下:

        python中的函數(shù)裝飾器解析

        .__name__:用來記錄函數(shù)的名稱

        .__doc__:用來記錄函數(shù)的文檔字符串

        5、map和匿名函數(shù)

        map( )傳入的第一個(gè)參數(shù)是一個(gè)函數(shù),第二個(gè)參數(shù)是一個(gè)序列

        python中的函數(shù)裝飾器解析

        5、多個(gè)裝飾器的順序

        一個(gè)函數(shù)的裝飾器可以有對(duì)個(gè),如果要使用多個(gè)裝飾器,在函數(shù)的定義之前加上對(duì)應(yīng)裝飾器的語法糖就可以

        多個(gè)裝飾器的使用順序:當(dāng)有多個(gè)裝飾器時(shí),從下到上調(diào)用裝飾器

        python中的函數(shù)裝飾器解析

        運(yùn)行結(jié)果為:

        python中的函數(shù)裝飾器解析

        6、帶有參數(shù)的裝飾器

        @log('westos')
        log('westos') –> 返回值是add_log
        add = add_log(add)

        python中的函數(shù)裝飾器解析

        運(yùn)行結(jié)果為:

        python中的函數(shù)裝飾器解析

        二、裝飾器練習(xí)

        1、 創(chuàng)建裝飾器, 要求如下:
        1). 創(chuàng)建add_log裝飾器, 被裝飾的函數(shù)打印日志信息;
        2). 日志格式為: [字符串時(shí)間] 函數(shù)名: xxx, 運(yùn)行時(shí)間:xxx, 運(yùn)行返回值結(jié)果:xxx

        python中的函數(shù)裝飾器解析

        運(yùn)行結(jié)果為:

        python中的函數(shù)裝飾器解析

        2、需求:用戶登陸驗(yàn)證的裝飾器 is_login
        1)如果用戶登陸成功,則執(zhí)行被裝飾的函數(shù)
        2)如果用戶登陸不成功,則執(zhí)行登陸函數(shù)

        python中的函數(shù)裝飾器解析

        運(yùn)行結(jié)果為:

        python中的函數(shù)裝飾器解析

        3、編寫裝飾器required_ints, 條件如下:
        1)確保函數(shù)接收到的每一個(gè)參數(shù)都是整數(shù);
        2) 如果參數(shù)不是整形數(shù), 打印 TypeError:參數(shù)必須為整形

        python中的函數(shù)裝飾器解析

        運(yùn)行結(jié)果為:

        python中的函數(shù)裝飾器解析

        4、多和裝飾器的應(yīng)用

        在我們實(shí)際的應(yīng)用場(chǎng)景中,會(huì)采用多個(gè)裝飾器先驗(yàn)證是否登陸成功再驗(yàn)證權(quán)限

        需求1:用戶登陸驗(yàn)證的裝飾器is_login

        1)如果用戶登陸成功,則執(zhí)行被裝飾的函數(shù)

        2)如果用戶登陸不成功,則顯示未登陸信息

        需求2:判斷登陸用戶是否是超級(jí)用戶is_root

        1)若是超級(jí)用戶root,則執(zhí)行裝飾函數(shù)

        2)若不是超級(jí)用戶,則報(bào)錯(cuò)

        python中的函數(shù)裝飾器解析

        運(yùn)行結(jié)果為:

        python中的函數(shù)裝飾器解析

        5、帶有參數(shù)的裝飾器練習(xí)

        編寫裝飾器required_types, 條件如下:
        1)當(dāng)裝飾器為@required_types(int,float)確保函數(shù)接收到的每一個(gè)參數(shù)都是int或者float類型;
        2)當(dāng)裝飾器為@required_types(list)確保函數(shù)接收到的每一個(gè)參數(shù)都是list類型;
        3)當(dāng)裝飾器為@required_types(str,int)確保函數(shù)接收到的每一個(gè)參數(shù)都是str或者int類型;
        4)如果參數(shù)不滿足條件, 打印 TypeError:參數(shù)必須為xxxx類型

        python中的函數(shù)裝飾器解析

        運(yùn)行結(jié)果為:

        python中的函數(shù)裝飾器解析

        python中的函數(shù)裝飾器解析

        贊(0)
        分享到: 更多 (0)
        網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
        主站蜘蛛池模板: 亚洲国产另类久久久精品| 99久久精品国内| 99精品在线观看| 亚洲精品国产高清不卡在线| 国产精品视频网| 亚洲AV午夜福利精品一区二区 | 亚洲国产精品日韩| 99精品久久久久中文字幕| 无码国内精品久久人妻蜜桃| 亚洲国产精品ⅴa在线观看| 精品国产污污免费网站入口| www夜片内射视频日韩精品成人| 99re6在线视频精品免费| 少妇人妻无码精品视频app| 亚洲精品国产综合久久一线| 久久精品国产99久久香蕉| 国产三级精品久久| 国产观看精品一区二区三区| 四虎国产精品永久地址51| 国产一精品一av一免费爽爽| 6一12呦女精品| 国产精品一久久香蕉国产线看观看| 亚洲热线99精品视频| 亚洲国产综合精品一区在线播放| 精品亚洲欧美中文字幕在线看| 国产精品99久久久久久猫咪| 成人国产精品秘 果冻传媒在线| 亚洲国产精品久久久久| 欧美激情精品久久久久| 免费精品一区二区三区第35| 欧美高清在线精品一区| 91久久精品国产免费直播| 99精品欧美一区二区三区| 99精品久久久久久久婷婷| 国产精品免费久久久久影院| 国产精品久久久久久久久久免费| 成人国产精品一区二区视频 | 99久久国产综合精品五月天喷水| 亚洲精品自产拍在线观看动漫| 九九热在线视频观看这里只有精品 | 一本色道久久88—综合亚洲精品|