python 帶引數裝飾器

2021-08-19 20:02:43 字數 2002 閱讀 8329

在前面一文《python裡為什麼需要使用裝飾器(decorator)》裡,我們學習了為什麼需要裝飾器,知道裝飾器就是為了不修改原來函式的**,又達到增加功能的作用。其實為了裝飾器更通用化,那麼裝飾器是否也可以帶引數呢?其實是可以的,這樣更加通用化了,達到共享極點。在前面也學習《為什麼要使用閉包(closures)》一文,知道引數可以巢狀函式裡實現隱藏,並且實現全域性引數的功能,與函式一起繫結。因此只需要結合這兩個知識點,就可以產生通用帶引數的裝飾器了。原來不帶引數的**如下:

[python]view plain

copy

#python 3.6

#定義乙個新的函式

def printstar(func):  

def f():  

print('*************************************')  

return func()  

return f  

@printstar

def add():      

return

1 + 1

@printstar

def sub():      

return

2 -1

print(add())  

print(sub())  

現在再對裝飾器函式進一步修改,再巢狀一層函式,實現閉包的功能,**就修改如下:

[python]view plain

copy

#python 3.6

#定義乙個新的函式

def title(show = ''):  

def printstar(func):  

def f():  

print(show,'*************************************')  

return func()  

return f  

return printstar  

@title('add')  

def add():      

return

1 + 1

@title('sub')  

def sub():      

return

2 -1

print(add())  

print(sub())  

輸出如下:

add *************************************

2sub *************************************

1經過帶引數的裝飾器的修改,這時控制輸出的內容,就更方便了。可以根據不同的函式名稱來進行修改輸出提示。

前面發現被裝飾的函式都沒有帶引數,這是為了簡單起見,現在來學習一下如果被裝飾的函式也引數,怎麼樣修改呢?

可以看下面的**:

[python]view plain

copy

#python 3.6

#定義乙個新的函式

def title(show = ''):  

def printstar(func):  

def f(a, b):  

print(show,'*************************************')  

return func(a, b)  

return f  

return printstar  

@title('add')  

def add(a, b):      

return a + b  

@title('sub')  

def sub(a, b):      

return a - b  

print(add(1, 1))  

print(sub(2, 1))  

由兩段**相比較,可以發現函式傳送引數是修改def f(a, b),就是第三層的函式。

裝飾器帶引數

裝飾器帶引數 帶引數的裝飾器是三層的 最外層的函式負責接受裝飾器引數 裡面的內容還是源裝飾器的內容 def outer a 第一層 負責接受引數的 defdecorate func 第二層 負責接受函式的 def wargs,kwargs 第三層 負責接受函式的引數 func wargs print...

裝飾器 帶引數

如果明白裝飾器的原理那麼帶引數的裝飾器就很容易理解了 def s1 func definner a,b f1 inner a,b 接受2個引數,然後在把2個引數傳遞給func a,b print hello r func a,b print word return r return inner s1...

python 實現帶引數的裝飾器

coding utf8 author bluesli defbefore request,kwarg print before defafter request,kwarg print after deffilter before fun,after fun defouter main fun de...