装饰器形成的过程
最简单的装饰器----有返回值的----有一个参数----万能参数装饰器的作用:
不想修改函数的调用方式,但是还想再原来的函数前后添加功能#原则:开放封闭原则
开放: 对扩展是开放的
封闭: 对修改是封闭的
语法糖:@装饰器函数名,@timmer等价于func = timmer(func),其中func()是被装饰函数,timmer()就是装饰器函数
最简单的装饰器
import time def timmer(f): start = time.time() f() end = time.time() print(end-start) def func(): time.sleep(0.1) print('nice!') timmer(func)
装饰有返回值的装饰器
import time #timmer()就是装饰器函数,只是对一个函数有装饰作用 def timmer(f):#通过此闭包函数返回一个内部函数名,然后在外部接收,让接收的函数名与外部函数名保持一致即可 def inner(): start = time.time() ret = f() #被装饰的函数 end = time.time() print(end-start) return ret return inner @timmer #语法糖---@装饰器函数名,等价于func = timmer(func) def func(): # 被装饰的函数 time.sleep(0.1) print('nice!') return 'summertrain' # func = timmer(func) result = func() print(result)
有一个参数
import time #timmer()就是装饰器函数 def timmer(f):#通过此闭包函数返回一个内部函数名,然后在外部接收,让接收的函数名与外部函数名保持一致即可 def inner(a): start = time.time() ret = f(a) #被装饰的函数 end = time.time() print(end-start) return ret return inner @timmer #语法糖---@装饰器函数名,等价于func = timmer(func) def func(a): # 被装饰的函数 time.sleep(0.1) print('nice!',a) return 'summertrain' # func = timmer(func) result = func(1) print(result)
万能参数
#装饰带多个参数,且包括按照位置以及参数传参的装饰器 import time #timmer()就是装饰器函数 def timmer(f):#通过此闭包函数返回一个内部函数名,然后在外部接收,让接收的函数名与外部函数名保持一致即可 def inner(*args,**kwargs): start = time.time() ret = f(*args,**kwargs) #被装饰的函数 end = time.time() print(end-start) return ret return inner @timmer #语法糖---@装饰器函数名,等价于func = timmer(func) def func(a,b): # 被装饰的函数 time.sleep(0.1) print('nice!',a,b) return 'summertrain' # func = timmer(func) result = func(1,b=22) print(result)
装饰器的固定模式
#例子 import time def wrapper(f): # f是被装饰的函数 def inner(*args,**kwargs): '''在被装饰函数之前要做的事儿''' ret = f(*args,**kwargs) '''在被装饰函数之前要后的事儿''' return ret return inner @wrapper def func(a,b): time.sleep(0.1) print('nice!',a,b) return 'summertrain' #减缩版 def wapper(func): def inner(*args,**kwargs): ret = func(*args,**kwargs) return ret return inner @wapper #qqxing = wapper(qqxing) def qqxing(): print(1111) result = qqxing()
装饰器进阶
def wahaha(): print('李白') print(wahaha,type(wahaha)) # 结果:<function wahaha at 0x00588B70> <class 'function'> #查看字符串格式的函数名 print(wahaha.__name__,type(wahaha.__name__)) # 结果:wahaha <class 'str'>
from functools import wraps def wrapper(f):#f=holiday @wraps(f) def inner(*args,**kwargs): print('before') ret = f(*args,**kwargs) print('later') return ret return inner @wrapper def holiday(day): '''放假通知''' print('国庆%s天假期'%day) return '开心' print(holiday.__doc__) print(holiday.__name__) result = holiday(7) print(result)
执行结果:
放假通知
holiday
before
国庆7天假期
later
开心