4-2日装饰器,带参数的装饰器
1,函数的有用信息
from functools import wraps#引用模块 def wrapper(f): # f = func1 @wraps(f) def inner(*args,**kwargs): #聚合 #args (1,2,3) '''执行函数之前的相关操作''' ret = f(*args,**kwargs) # 打散 1,2,3 '''执行函数之后的相关操作''' return ret return inner
2,装饰器的应用场景:比如插入日志,性能测试,事务处理,缓存等等场景。
def func1(): """ 此函数是什么功能,参数分别是什么作用。 :return: 返回值是登录成功与否(True,False) """ print(999) return True func1() print(func1.__name__) print(func1.__doc__)
def func1(): """ 此函数是完成什么的功能,参数分别是。。。作用。 :return: 返回值是登录成功与否(True,False) """ print(666) print(func1.__name__) print(func1.__doc__) return True func1()
3,装饰器带多个参数
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('此函数的执行效率%f' % (end_time-start_time)) else: ret = f(*args, **kwargs) return ret return inner return wrapper flag = True @timmer(flag,2,3) # 两步:1,timmer(flag) --> wrapper 2,@wrapper 装饰器 def func1(): print(666) @timmer(flag) def func2(): print(777) func1() func2()
4,多个装饰器装饰一个参数
def wrapper1(func): # func == f函数名 def inner1(): print('wrapper1 ,before func') # 2 func() print('wrapper1 ,after func') # 4 return inner1 def wrapper2(func): # func == inner1 def inner2(): print('wrapper2 ,before func') # 1 func() print('wrapper2 ,after func') # 5 return inner2 # @wrapper3 @wrapper2 # f = wrapper2(f) 里面的f==inner1 外面的f == inner2 @wrapper1 # f = wrapper1(f) 里面的f==函数名f 外面的f == inner1 def f(): # 3 print('in f') f() # inner2()
Python语言函数代码的执行流程,为了保证函数的定义先于其首次调用时执行,我们需要知道中语句的执行顺序。
执行总是从程序的第一行代码开始的,从上到下,从左到右,按顺序依次执行第一条语句。
函数定义并不会改变程序的执行流程,但应该注意函数代码块中的语句并不是立即就执行的,而是等到函数被程序调用时才会执行。
函数调用可以看作程序执行流程中的一个迂回路径,遇到函数调用时,并不会直接继续执行下一条语句,而是跳到函数体的第一行,继续执行完函数代码块的所有语句,再跳回到原来离开的地方。
看似比较简单,一会你会发现,函数代码块中可以调用其他函数,当程序流程运行到一个函数之中时,可能需要执行其他函数中的语句。但当执行那个函数中的语句时,又可能再需要调用执行另一个函数的语句。
幸好Python对于它运行到哪里有很好的记录,所以在每个函数执行结束之后,程序都能跳回到它离开的那个地方,直到执行到整个程序的结尾,才会结束程序。
当我们看别人的Python代码的时候,并不总是应该一行行的按照书写顺序来阅读,有时候,按照执行的流程来阅读代码,理解代码的含义才会更好一些。