装饰器
装饰器形成的过程 : 最简单的装饰器 有返回值的 有一个参数 万能参数
装饰器的作用
原则 :开放封闭原则
语法糖 :@
装饰器的固定模式
import time print(time.time()) # 获取当前时间 time.sleep(10) #让程序在执行到这个位置的时候停一会儿 def timmer(f): #装饰器函数 def inner(): start = time.time() ret = f() #被装饰的函数 end = time.time() print(end - start) return ret return inner @timmer #语法糖 @装饰器函数名 def func(): #被装饰的函数 time.sleep(0.01) print('老板好同事好大家好') return '新年好' # func = timmer(func) ret = func() #inner() print(ret)
装饰器的作用 —— 不想修改函数的调用方式 但是还想在原来的函数前后添加功能
timmer就是一个装饰器函数,只是对一个函数 有一些装饰作用
原则: 开放封闭原则
开放 : 对扩展是开放的
封闭 : 对修改是封闭的
封版
def outer(): def inner(): return 'inner' inner() outer() 装饰带参数函数的装饰器 def timmer(f): #装饰器函数 def inner(*args,**kwargs): #(1,2) /(1) start = time.time() ret = f(*args,**kwargs) #f(1,2) #被装饰的函数 end = time.time() print(end - start) return ret return inner @timmer #语法糖 @装饰器函数名 def func(a,b): #被装饰的函数 time.sleep(0.01) print('老板好同事好大家好',a,b) return '新年好' @timmer #语法糖 @装饰器函数名 def func1(a): #被装饰的函数 time.sleep(0.01) print('老板好同事好大家好',a) return '新年好' # func = timmer(func) ret = func(1,2) #inner() ret = func(1,b = 2) #inner() print(ret) def wrapper(f): #装饰器函数,f是被装饰的函数 def inner(*args,**kwargs): '''在被装饰函数之前要做的事''' ret = f(*args,**kwargs) #被装饰的函数 '''在被装饰函数之后要做的事''' return ret return inner @wrapper #语法糖 @装饰器函数名 def func(a,b): #被装饰的函数 time.sleep(0.01) print('老板好同事好大家好',a,b) return '新年好' def wrapper(): def inner(): pass return inner def wrapper(func): #qqxing def inner(*args,**kwargs): ret = func(*args,**kwargs) #被装饰的函数 return ret return inner @wrapper #qqxing = wrapper(qqxing) def qqxing(): print(123) ret = qqxing() #inner
固定模式
def wrapper(f): #装饰器函数,f是被装饰的函数 def inner(*args,**kwargs): '''在被装饰函数之前要做的事''' ret = f(*args,**kwargs) #被装饰的函数 '''在被装饰函数之后要做的事''' return ret return inner
函数 函数的定义和调用
def 函数名(形参):
函数体
return 返回值
调用 函数名(实参)
站在形参的角度上 : 位置参数,*args,默认参数(陷阱),**kwargs
站在实参的角度上 : 按照位置传,按照关键字传
返回值:没有返回值 返回一个值 返回多个值
接收返回值:没有返回值不接收,返回一个值用一个变量接收,返回多个值用一个变量或者对应数目的变量接收
闭包函数 —— 在内部函数引用外部函数的变量
装饰器函数—— 装饰器一定是闭包函数
装饰器的作用 : 在不改变原来函数的调用方式的情况下 在这个函数的前后添加新的功能
完美的符合了一个开发原则 :开放封闭原则
对扩展是开放的
对修改是封闭的
基础的装饰器
from functools import wraps def wrapper(func): @wraps(func) def inner(*args,**kwargs): '''在函数被调用之前添加的代码''' ret = func(*args,**kwargs) # func是被装饰的函数 在这里被调用 '''在函数被调用之后添加的代码''' return ret return inner 使用 —— @wrapper @wrapper def func(): #inner pass func.__name__
带参数的装饰器
@wrapper -- > @warapper(argument) 三层嵌套函数 def outer(形参): def wrapper(func): def inner(*args,**kwargs): '''在函数被调用之前添加的代码''' ret = func(*args,**kwargs) # func是被装饰的函数 在这里被调用 '''在函数被调用之后添加的代码''' return ret return inner return wrapper @outer(True) def func(): pass
多个装饰器装饰一个函数
俄罗斯套娃
def wrapper1(func): @wraps(func) def inner(*args,**kwargs): print('before 1') print('******') ret = func(*args,**kwargs) # func是被装饰的函数 在这里被调用 '''在函数被调用之后添加的代码''' return ret def wrapper2(func): @wraps(func) def inner(*args,**kwargs): print('before 2') ret = func(*args,**kwargs) # func是被装饰的函数 在这里被调用 '''在函数被调用之后添加的代码''' return ret @wrapper1 @wrapper2 def func(): print('111')