**裝飾器**
- [ ] 裝飾器和閉包有很大的聯絡。有時你需要在不改變源**的情況下修改已經存在的函式。裝飾器的運用可以提高效率,減少重複的**。
- [ ] 裝飾器的實質是乙個函式。它把乙個函式作為輸入並且返回另乙個函式。
在裝飾器中,通常使用下面這些python技巧:
1.*args 和 **kwargs
2.閉包
3.作為引數的函式
例函式 document_it() 定義了乙個裝飾器,會實現如下的功能:
- [ ] 列印輸出函式的名字和引數的值
- [ ] 執行含有引數的函式
- [ ] 列印輸出的結果
- [ ] 返回修改後的函式
```def document_it(func):
def new_fuction(*args, **kwargs):
print('running fuction:',func,_name_)
print('positional arguments:',args)
print('keyword arguments',kwargs)
result = func(*args, **kwargs)
print('result:',result)
return result
return new_fuction
```無論傳入 document_it() 的函式 func 是什麼,裝飾器都會返回乙個新的函式,其中包含函式 document_it() 增加的額外語句。實際上,裝飾器並不需要執行函式 func 中的**,只是在結束前函式 document_it() 呼叫函式 func 以便得到 func 的返結果和附加**的結果。
**那麼如何使用裝飾器呢?**
- [ ] 人工賦值
```def document_it(func): #裝飾器
def new_fuction(*args, **kwargs):
print('running fuction:',func)
print('positional arguments:',args)
print('keyword arguments',kwargs)
result = func(*args, **kwargs)
print('result:',result)
return result
return new_fuction
def add_ints(a,b): #被裝飾函式
return a+b
cooler_add_ints = document_it(add_ints) #人工對裝飾器賦值
cooler_add_ints(3,5)
####################################
結果running fuction:
positional arguments: (3, 5)
keyword arguments {}
result: 8
```- [ ] 直接賦值(在要裝飾的函式前新增裝飾器的名字 例 @decorator_name)
```def document_it(func): #裝飾器
def new_fuction(*args, **kwargs):
print('running fuction:',func)
print('positional arguments:',args)
print('keyword arguments',kwargs)
result = func(*args, **kwargs)
print('result:',result)
return result
return new_fuction
@document_it
def add_ints(a,b): #被裝飾函式
return a+b
add_ints(3,5)
###################################
結果running fuction:
positional arguments: (3, 5)
keyword arguments {}
result: 8
```同樣乙個函式可以有多個裝飾器。
下面我們寫乙個對結果求平法的裝飾器 square_it ():
```def document_it(func): #裝飾器
def new_fuction(*args, **kwargs):
print('running fuction:',func)
print('positional arguments:',args)
print('keyword arguments',kwargs)
result = func(*args, **kwargs)
print('result:',result)
return result
return new_fuction
def square_it(func):
def new_function(*args,**kwargs):
result = func(*args,**kwargs)
return result * result
return new_function
@document_it
@square_it
def add_ints(a,b): #被裝飾函式
return a + b
add_ints(3,5)
############################結果
running fuction: .new_function at 0x000001e63b199ea0>
positional arguments: (3, 5)
keyword arguments {}
result: 64
```靠近函式定義 (def上面) 的裝飾器最先執行,然後依次執行上面的,任何順序都會得到相同的結果。
```def document_it(func): #裝飾器
def new_fuction(*args, **kwargs):
print('running fuction:',func)
print('positional arguments:',args)
print('keyword arguments',kwargs)
result = func(*args, **kwargs)
print('result:',result)
return result
return new_fuction
def square_it(func):
def new_function(*args,**kwargs):
result = func(*args,**kwargs)
return result * result
return new_function
@square_it
@document_it ###交換後
def add_ints(a,b): #被裝飾函式
return a + b
add_ints(3,5)
######################結果
running fuction:
positional arguments: (3, 5)
keyword arguments {}
result: 8
Python學習筆記8 語法基礎
s i love hanxuexue print s i love hanxuexue 如果想表示出let s go來 1.可以使用巢狀引號,即外層使用雙引號 2.使用轉義字元 s let s go print s ss let s go print ss sss c user print sss ...
python基礎學習 裝飾器
學習python時,我提出過如下問題 1.裝飾器是什麼?2.乙個 符號 乙個函式名就是乙個裝飾器了?3.什麼時候要用到這是神器的工具?到底怎麼理解 怎麼應用裝飾器,在本文中概括一下自己的理解。一 先舉栗子,逐層分析 1 獲取func函式的執行時間 2 import time 3 4 這是乙個計時函式...
Python基礎學習(裝飾器)
增強乙個函式的功能,但又不想修改函式的定義,這種在 執行期間動態增加功能的方式,稱之為裝飾器。def log func def args,kw print callback format func.name return func args,kw log defnow print 2019 3 21...