pyhon基础之装饰器
装饰器的作用
装饰器的作用:不想修改函数的调用方式 但是还想在原来的函数前后添加功能
装饰器的原则: 开放封闭原则
开放 : 对扩展是开放的
封闭 : 对修改是封闭的
装饰器的本质:闭包函数
#通用装饰器格式 def wrapper(func): #装饰器函数,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 '好开心' ret = holiday(3) print(ret) ''' 打印: 在被装饰的函数执行之前做的事 全体放假3天 在被装饰的函数执行之后做的事 好开心 '''
装饰器进阶:
带参数的装饰器:
即多一个变量存储标识位,来决定被装饰函数是否需要装饰。
#带参数的作用,即是定义一个标识位决定是否需要函数是否需要装饰 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()
flag = Ture执行装饰的器,False不执行装饰器
多个装饰器装饰一个函数
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 @wrapper2 @wrapper1 def f(): print('in f') return '哈哈哈' f()
执行过程如下图: