4-2日装饰器,带参数的装饰器
1,函數(shù)的有用信息
from functools import wraps#引用模塊 def wrapper(f): # f = func1 @wraps(f)def inner(*args,**kwargs): #聚合#args (1,2,3)'''執(zhí)行函數(shù)之前的相關(guān)操作'''ret = f(*args,**kwargs) # 打散 1,2,3'''執(zhí)行函數(shù)之后的相關(guān)操作'''return retreturn inner2,裝飾器的應(yīng)用場景:比如插入日志,性能測試,事務(wù)處理,緩存等等場景。
def func1():"""此函數(shù)是什么功能,參數(shù)分別是什么作用。:return: 返回值是登錄成功與否(True,False)"""print(999)return Truefunc1() print(func1.__name__) print(func1.__doc__) def func1():"""此函數(shù)是完成什么的功能,參數(shù)分別是。。。作用。:return: 返回值是登錄成功與否(True,False)"""print(666)print(func1.__name__)print(func1.__doc__)return True func1()3,裝飾器帶多個參數(shù)
import time def timmer(*args,**kwargs):def wrapper(f):def inner(*args,**kwargs):if flag:start_time = time.time()ret = f(*args,**kwargs)time.sleep(0.3)end_time = time.time()print('此函數(shù)的執(zhí)行效率%f' % (end_time-start_time))else:ret = f(*args, **kwargs)return retreturn innerreturn wrapperflag = True @timmer(flag,2,3) # 兩步:1,timmer(flag) --> wrapper 2,@wrapper 裝飾器 def func1():print(666)@timmer(flag) def func2():print(777) func1() func2()4,多個裝飾器裝飾一個參數(shù)
def wrapper1(func): # func == f函數(shù)名def inner1():print('wrapper1 ,before func') # 2 func()print('wrapper1 ,after func') # 4return inner1def wrapper2(func): # func == inner1def inner2():print('wrapper2 ,before func') # 1 func()print('wrapper2 ,after func') # 5return inner2 # @wrapper3 @wrapper2 # f = wrapper2(f) 里面的f==inner1 外面的f == inner2 @wrapper1 # f = wrapper1(f) 里面的f==函數(shù)名f 外面的f == inner1 def f(): # 3print('in f')f() # inner2()?
Python語言函數(shù)代碼的執(zhí)行流程,為了保證函數(shù)的定義先于其首次調(diào)用時執(zhí)行,我們需要知道中語句的執(zhí)行順序。
執(zhí)行總是從程序的第一行代碼開始的,從上到下,從左到右,按順序依次執(zhí)行第一條語句。
函數(shù)定義并不會改變程序的執(zhí)行流程,但應(yīng)該注意函數(shù)代碼塊中的語句并不是立即就執(zhí)行的,而是等到函數(shù)被程序調(diào)用時才會執(zhí)行。
函數(shù)調(diào)用可以看作程序執(zhí)行流程中的一個迂回路徑,遇到函數(shù)調(diào)用時,并不會直接繼續(xù)執(zhí)行下一條語句,而是跳到函數(shù)體的第一行,繼續(xù)執(zhí)行完函數(shù)代碼塊的所有語句,再跳回到原來離開的地方。
看似比較簡單,一會你會發(fā)現(xiàn),函數(shù)代碼塊中可以調(diào)用其他函數(shù),當(dāng)程序流程運行到一個函數(shù)之中時,可能需要執(zhí)行其他函數(shù)中的語句。但當(dāng)執(zhí)行那個函數(shù)中的語句時,又可能再需要調(diào)用執(zhí)行另一個函數(shù)的語句。
幸好Python對于它運行到哪里有很好的記錄,所以在每個函數(shù)執(zhí)行結(jié)束之后,程序都能跳回到它離開的那個地方,直到執(zhí)行到整個程序的結(jié)尾,才會結(jié)束程序。
當(dāng)我們看別人的Python代碼的時候,并不總是應(yīng)該一行行的按照書寫順序來閱讀,有時候,按照執(zhí)行的流程來閱讀代碼,理解代碼的含義才會更好一些。
?
轉(zhuǎn)載于:https://www.cnblogs.com/yzxing/p/8692313.html
總結(jié)
以上是生活随笔為你收集整理的4-2日装饰器,带参数的装饰器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS 14 三大隐藏功能分享 | 如何
- 下一篇: 苹果iPhone 12减配,你还会购买吗