亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python裝飾器設置參數方式

 更新時間:2024年02月19日 08:38:27   作者:道航不高  
這篇文章主要介紹了python裝飾器設置參數方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

前言

一開始沒打算寫這篇文章的,今天整理筆記看到了偏函數的帖子在拿裝飾器舉例對比。

然后就想到既然裝飾器本身也是函數,為啥不可以給裝飾器也設置上參數,來進一步提高裝飾器的復用性呢?

于是把思路整理了一下,就有了本文。

裝飾器原理回顧

在我的另一篇關于裝飾器的文章中有跟大家提到過,裝飾器實際上就是一個閉包函數,在閉包函數的內部函數中添加裝飾的內容并調用被裝飾的函數。

以達到 fun = decorator(fun) 的效果:

def decorator(fun):
    def inner(name):
        print("Hi")
        fun(name)
    return inner

@decorator
def get_last_name(name):
    print(f"你就是小{name[0]}吧")
    
get_last_name("王富貴")

從上面的例子中我們可以簡單的總結出裝飾器不同參數設置的規(guī)律:

裝飾器外部的函數傳的參數是被裝飾函數的函數名,內部函數的參數是被裝飾函數的參數。

使用裝飾器時,被裝飾函數的參數name是先傳遞給裝飾器的內部函數,內部函數調用被裝飾函數時將參數name傳遞給被裝飾函數。

而外部函數接收的參數時被裝飾函數的函數名,注意,外部函數的參數只能有一個也只能是被裝飾函數的函數名。

"""錯誤寫法"""
def decorator(fun,*args_outer):
    def inner(*args_inner):
        pass

一個很簡單的道理,裝飾器的用法是@+裝飾器名+被裝飾函數。

其工作原理就是fun = decorator(fun) ,即裝飾器接收的第一個參數就必須是被裝飾函數名,如果設置其他參數的話在第一個參數都缺失的情況下怎么傳?

不過并不是完全沒辦法,換一換思路就可以了,下面就是本文要講的干貨了

裝飾器設置參數:多層閉包嵌套

?我們都知道,裝飾器就是一個閉包函數,外部接收被裝飾函數名,內部裝飾再調用被裝飾函數。

那么我們?yōu)樯恫辉谶@個閉包函數的外部再嵌套一層函數用來接收自己想要的參數呢?

廢話不多說,舉例子上代碼:

"""假設一家燒烤店可以送外賣,外賣比堂食要多出打包盒跟配送費兩項費用"""
def decorator_outer(*args_outer):   # 接收正常在店內消費之外的其他費用
    def decorator_inner(fun):
        def inner(*args_inner):     # 接收在正常參數的費用
            new_args = args_outer + args_inner
            return fun(*new_args)
        return inner
    return decorator_inner

@decorator_outer(3,5)   # 打包盒3元,配送費5元
def monetary(*args):    # 計算每份菜品價格之和
    themoney = 0
    for m in args:
        themoney += m
    return themoney

上一次的文章說到,閉包調用內部函數的方法是decorator()(),那么類似上述代碼中多嵌套了一層就自然是decorator_outer()()()。

也就是說按照裝飾器的工作原理,上述代碼的工作原理就是

monetary = decorator_outer(3,5)(monetary)

小小的提醒一下,閉包嵌套層次越多就一定要注意看看被裝飾函數的返回值有沒有被一層層的返回出來,不然最后返回一個空值又不報錯很難排查。

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Qt調用Python詳細圖文過程記錄

    Qt調用Python詳細圖文過程記錄

    Qt調用python實際上就是c++調python,網上搜會出來很多,介紹得也比較全,這里做個記錄,下面這篇文章主要給大家介紹了關于Qt調用Python詳細圖文過程,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-05-05
  • Python 監(jiān)測文件是否更新的方法

    Python 監(jiān)測文件是否更新的方法

    今天小編就為大家分享一篇Python 監(jiān)測文件是否更新的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • 詳解Python?Requests庫中的重試策略

    詳解Python?Requests庫中的重試策略

    在Python中,requests庫是處理HTTP請求的標準工具之一,這篇文章主要為大家介紹了如何在requests中實現請求的自動重試,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-11-11
  • python?包?requests?實現請求操作

    python?包?requests?實現請求操作

    這篇文章主要介紹了python?包?requests?實現請求操作,文章介紹內容包括帶參數請求、自定義headers,文章內容詳細具有一定的參考價值,需要的小伙伴可以參考一下
    2022-04-04
  • 常用python編程模板匯總

    常用python編程模板匯總

    這篇文章主要為大家詳細介紹了常用python編程模板,總結了Python編程常用模板,感興趣的朋友可以參考一下
    2016-02-02
  • python使用Turtle庫繪制動態(tài)鐘表

    python使用Turtle庫繪制動態(tài)鐘表

    這篇文章主要為大家詳細介紹了python使用Turtle庫繪制動態(tài)鐘表,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • python numpy數組復制使用實例解析

    python numpy數組復制使用實例解析

    這篇文章主要介紹了python numpy數組復制使用實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-01-01
  • 利用python循環(huán)創(chuàng)建多個文件的方法

    利用python循環(huán)創(chuàng)建多個文件的方法

    今天小編就為大家分享一篇利用python循環(huán)創(chuàng)建多個文件的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • Python中json模塊load/loads方法實戰(zhàn)以及參數詳解

    Python中json模塊load/loads方法實戰(zhàn)以及參數詳解

    經常在Python中對JSON格式的文件進行操作,今天對這些操作做一個總結,下面這篇文章主要給大家介紹了關于Python中json模塊load/loads方法實戰(zhàn)以及參數的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-08-08
  • 詳解Python自帶的日期日歷處理calendar庫的使用

    詳解Python自帶的日期日歷處理calendar庫的使用

    在?Python?開發(fā)中,我們經常需要處理日期和時間,雖然?datetime?庫是最常用的選擇,但其實?Python?標準庫中的?calendar?模塊也是一個強大的工具,下面我們就來看看它的具體使用吧
    2024-12-12

最新評論