站長資訊網
        最全最豐富的資訊網站

        python中的函數裝飾器解析

        一、函數裝飾器

        1、函數裝飾器的定義:

        裝飾器的實現是函數里面嵌套函數
        在不改變原函數的基礎上,給函數增加功能",把一個函數當作參數,返回一個替代版的函數
        本質上:返回函數的函數

        裝飾器需要傳遞一個函數, 返回值也是一個函數對象.

        示例1:調用新函數

        如下outer函數就是一個裝飾器,func是形參接收的一個函數,inner是返回的函數

        python中的函數裝飾器解析

        示例2:

        python中的函數裝飾器解析

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

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

        python中的函數裝飾器解析

        運行結果如下:

        python中的函數裝飾器解析

        3、導入string模塊,使得我們可以調用與字符串操作相關的函數

        python中的函數裝飾器解析

        4、裝飾器需求:獲取每個函數的執行時間
        1.函數執行之前計算時間
        2.函數執行之后計算時間

        導入random模塊和string模塊,來生成100個大寫或小寫字母為元素組成的列表

        python中的函數裝飾器解析

        運行結果如下:

        python中的函數裝飾器解析

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

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

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

        python中的函數裝飾器解析

        運行結果為:

        python中的函數裝飾器解析

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

        導入import functools模塊來保留被裝飾函數的函數名和幫助文檔信息

        python中的函數裝飾器解析

        運行結果如下:

        python中的函數裝飾器解析

        .__name__:用來記錄函數的名稱

        .__doc__:用來記錄函數的文檔字符串

        5、map和匿名函數

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

        python中的函數裝飾器解析

        5、多個裝飾器的順序

        一個函數的裝飾器可以有對個,如果要使用多個裝飾器,在函數的定義之前加上對應裝飾器的語法糖就可以

        多個裝飾器的使用順序:當有多個裝飾器時,從下到上調用裝飾器

        python中的函數裝飾器解析

        運行結果為:

        python中的函數裝飾器解析

        6、帶有參數的裝飾器

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

        python中的函數裝飾器解析

        運行結果為:

        python中的函數裝飾器解析

        二、裝飾器練習

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

        python中的函數裝飾器解析

        運行結果為:

        python中的函數裝飾器解析

        2、需求:用戶登陸驗證的裝飾器 is_login
        1)如果用戶登陸成功,則執行被裝飾的函數
        2)如果用戶登陸不成功,則執行登陸函數

        python中的函數裝飾器解析

        運行結果為:

        python中的函數裝飾器解析

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

        python中的函數裝飾器解析

        運行結果為:

        python中的函數裝飾器解析

        4、多和裝飾器的應用

        在我們實際的應用場景中,會采用多個裝飾器先驗證是否登陸成功再驗證權限

        需求1:用戶登陸驗證的裝飾器is_login

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

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

        需求2:判斷登陸用戶是否是超級用戶is_root

        1)若是超級用戶root,則執行裝飾函數

        2)若不是超級用戶,則報錯

        python中的函數裝飾器解析

        運行結果為:

        python中的函數裝飾器解析

        5、帶有參數的裝飾器練習

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

        python中的函數裝飾器解析

        運行結果為:

        python中的函數裝飾器解析

        python中的函數裝飾器解析

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 中文字幕精品亚洲无线码一区| 国产精品女同一区二区| 亚洲一区爱区精品无码| 久久国产精品成人免费| 国产亚洲精品美女久久久| 在线观看国产精品普通话对白精品| 国产成人精品久久综合| 97人妻无码一区二区精品免费| 中文字幕一区二区三区日韩精品| 国产欧美精品一区二区色综合| 欧美成人精品一级高清片| 国产精品福利区一区二区三区四区| 人妻少妇精品中文字幕av蜜桃| 久久久精品久久久久久| 国产精品成人一区二区| 精品一区二区三区中文字幕| 婷婷精品国产亚洲AV麻豆不片| 日韩精品中文字幕第2页| 国产综合免费精品久久久| 国产A∨免费精品视频| 四虎国产精品免费入口| 99亚洲精品视频| 久久国产乱子伦精品免费强| 精品亚洲aⅴ在线观看| 日韩精品无码一区二区三区免费 | 午夜影视日本亚洲欧洲精品一区| 国产剧情国产精品一区| 人妻精品久久无码区| 亚洲精品乱码久久久久久按摩| 亚洲婷婷国产精品电影人久久| 老司机午夜网站国内精品久久久久久久久| 精品国产国产综合精品| 精品国产综合区久久久久久| 精品无码人妻久久久久久| 久久精品国产72国产精福利| 精品一区二区无码AV| 欧美日韩精品一区二区三区不卡 | 欧美日韩精品在线观看| 亚洲国产精品狼友中文久久久| 亚洲精品WWW久久久久久| 亚洲欧洲自拍拍偷精品 美利坚|