1. 程式人生 > >python 基礎 —裝飾器練習

python 基礎 —裝飾器練習

由於對裝飾器不是特別理解,因此做了以下練習,並debug自行理解,在此做一個記錄

以下練習均出自菜鳥教程裝飾器一章 http://www.runoob.com/w3cnote/python-func-decorators.html

第一個練習

 1 from functools import wraps
 2 
 3 def deco_name(f):
 4     @wraps(f)
 5     def decorated(*args,**kwargs):
 6         if not can_run:
 7             return "Function will not run
" 8 return f(*args,**kwargs) 9 return decorated 10 11 @deco_name #func=deco_name(func) 12 def func(): #執行了deco_name裝飾器後返回來了decorated,因此func=decorated 13 return("Function is running") 14 15 can_run =True 16 print(func()) 17 #執行func()相當於執行decorated() 18 # can_run =True,因此decorated()返回func()返回的值:"Function is running"
19 20 can_run =False 21 print(func()) 22 #can_run =False,decorated()進入if選擇,返回了"Function will not run"
View Code

 

當使用裝飾器裝飾一個函式時,函式本身就已經是一個新的函式;即函式名稱或屬性產生了變化。

在python的functools模組中提供了wraps裝飾函式來確保原函式在使用裝飾器時不改變自身的函式名及應有屬性。
因此在裝飾器的編寫中建議加入wraps確保被裝飾的函式不會因裝飾器帶來異常情況。