*裝飾器實際上就是一個函數函數
*有兩個特別之處io
1.參數是一個函數import
2.返回值是一個函數im
def my(func): #參數是一個函數裝飾器
def w():tools
print("hello,world") #在裝飾函數以前輸出這句話data
func() #裝飾器修飾的函數的輸出return
return w #返回一個函數 ps
@my參數
def run():
print("run")
run()
等價於 run=my(run)=w
1.裝飾器中定義的函數,要使用*args,**kwargs兩隊兄弟的組合.而且在這個函數中執行的時候也要把*args,**kwargs傳進去.
2.須要使用functools.wraps在裝飾器中的函數上把傳進來的這個函數進行一個包裹,這樣就不會丟失原來的函數的__name__等屬性.
from functools import wraps
def my(func):
@wraps(func)
def w(*args,**kwargs):
print("hello,world")
func(*args,**kwargs)
return w