python裝飾器設置參數(shù)方式
前言
一開始沒打算寫這篇文章的,今天整理筆記看到了偏函數(shù)的帖子在拿裝飾器舉例對比。
然后就想到既然裝飾器本身也是函數(shù),為啥不可以給裝飾器也設置上參數(shù),來進一步提高裝飾器的復用性呢?
于是把思路整理了一下,就有了本文。
裝飾器原理回顧
在我的另一篇關于裝飾器的文章中有跟大家提到過,裝飾器實際上就是一個閉包函數(shù),在閉包函數(shù)的內部函數(shù)中添加裝飾的內容并調用被裝飾的函數(shù)。
以達到 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("王富貴")
從上面的例子中我們可以簡單的總結出裝飾器不同參數(shù)設置的規(guī)律:
裝飾器外部的函數(shù)傳的參數(shù)是被裝飾函數(shù)的函數(shù)名,內部函數(shù)的參數(shù)是被裝飾函數(shù)的參數(shù)。
使用裝飾器時,被裝飾函數(shù)的參數(shù)name是先傳遞給裝飾器的內部函數(shù),內部函數(shù)調用被裝飾函數(shù)時將參數(shù)name傳遞給被裝飾函數(shù)。
而外部函數(shù)接收的參數(shù)時被裝飾函數(shù)的函數(shù)名,注意,外部函數(shù)的參數(shù)只能有一個也只能是被裝飾函數(shù)的函數(shù)名。
"""錯誤寫法"""
def decorator(fun,*args_outer):
def inner(*args_inner):
pass
一個很簡單的道理,裝飾器的用法是@+裝飾器名+被裝飾函數(shù)。
其工作原理就是fun = decorator(fun) ,即裝飾器接收的第一個參數(shù)就必須是被裝飾函數(shù)名,如果設置其他參數(shù)的話在第一個參數(shù)都缺失的情況下怎么傳?
不過并不是完全沒辦法,換一換思路就可以了,下面就是本文要講的干貨了
裝飾器設置參數(shù):多層閉包嵌套
?我們都知道,裝飾器就是一個閉包函數(shù),外部接收被裝飾函數(shù)名,內部裝飾再調用被裝飾函數(shù)。
那么我們?yōu)樯恫辉谶@個閉包函數(shù)的外部再嵌套一層函數(shù)用來接收自己想要的參數(shù)呢?
廢話不多說,舉例子上代碼:
"""假設一家燒烤店可以送外賣,外賣比堂食要多出打包盒跟配送費兩項費用"""
def decorator_outer(*args_outer): # 接收正常在店內消費之外的其他費用
def decorator_inner(fun):
def inner(*args_inner): # 接收在正常參數(shù)的費用
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
上一次的文章說到,閉包調用內部函數(shù)的方法是decorator()(),那么類似上述代碼中多嵌套了一層就自然是decorator_outer()()()。
也就是說按照裝飾器的工作原理,上述代碼的工作原理就是
monetary = decorator_outer(3,5)(monetary)
小小的提醒一下,閉包嵌套層次越多就一定要注意看看被裝飾函數(shù)的返回值有沒有被一層層的返回出來,不然最后返回一個空值又不報錯很難排查。
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
python?包?requests?實現(xiàn)請求操作
這篇文章主要介紹了python?包?requests?實現(xiàn)請求操作,文章介紹內容包括帶參數(shù)請求、自定義headers,文章內容詳細具有一定的參考價值,需要的小伙伴可以參考一下2022-04-04
利用python循環(huán)創(chuàng)建多個文件的方法
今天小編就為大家分享一篇利用python循環(huán)創(chuàng)建多個文件的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10
Python中json模塊load/loads方法實戰(zhàn)以及參數(shù)詳解
經(jīng)常在Python中對JSON格式的文件進行操作,今天對這些操作做一個總結,下面這篇文章主要給大家介紹了關于Python中json模塊load/loads方法實戰(zhàn)以及參數(shù)的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-08-08

