自學Python之路-Python基礎+模塊+面向對象
自學Python之路-Python網絡編程
自學Python之路-Python併發編程+數據庫+前端
自學Python之路-djangohtml
對於裝飾器咱們都知道它主要的功能是:在不改變被裝飾的函數及被裝飾的函數的執行方式下,給函數增長額外功能的函數,可是咱們在查看一個函數的註釋和函數名的時候,若是這個函數帶有裝飾器,那麼咱們看到是註釋信息和函數名就是裝飾器裏面的信息,而不是原來函數的信息,那麼如何解決,實例以下:前端
from functools import wraps def wrapper(func): #func = holiday @wraps(func) def inner(*args,**kwargs): print('在被裝飾的函數執行以前作的事') ret = func(*args,**kwargs) print('在被裝飾的函數執行以後作的事') return ret return inner @wrapper #holiday = wrapper(holiday) def holiday(day): '''這是一個放假通知''' print('全體放假%s天'%day) return '好開心' print(holiday.__name__) print(holiday.__doc__) ret = holiday(3) #inner print(ret)
假如大家公司有300個函數使用了同一個裝飾器,如今那領導讓你把這些裝飾器所有取消掉,你該怎麼作? 數據庫
使用最笨的辦法一個一個添加?這樣的話須要添加多長時間?而後幾天以後領導說再把那些裝飾器加上吧,你什麼思想?那這個時候就能夠用到帶有參數的裝飾器:django
import time FLAGE = False def timmer_out(flag): def timmer(func): def inner(*args,**kwargs): if flag: start = time.time() ret = func(*args,**kwargs) end = time.time() print(end-start) return ret else: ret = func(*args, **kwargs) return ret return inner return timmer # timmer = timmer_out(FLAGE) @timmer_out(FLAGE) #wahaha = timmer(wahaha) def wahaha(): time.sleep(0.1) print('wahahahahahaha') @timmer_out(FLAGE) def erguotou(): time.sleep(0.1) print('erguotoutoutou') wahaha() erguotou()
在實際生產中,有的時候可能會用到多個裝飾器來裝飾同一個函數,下面咱們就來講一下多個裝飾器在裝飾同一個函數具體的過程,實例以下:編程
def wrapper1(func): def inner1(): print('wrapper1 ,before func') ret = func() print('wrapper1 ,after func') return ret return inner1 def wrapper2(func): def inner2(): print('wrapper2 ,before func') ret = func() print('wrapper2 ,after func') return ret return inner2 def wrapper3(func): def inner3(): print('wrapper3 ,before func') ret = func() print('wrapper3 ,after func') return ret return inner3 @wrapper3 @wrapper2 @wrapper1 def f(): print('in f') return '哈哈哈' print(f())