# 装饰器的进阶
# functools.wraps # 带参数的装饰器 # 多个装饰器装饰同一个函数# 周末的作业 # 文件操作 # 字符串处理 # 输入输出 # 流程控制# 装饰器
# 开发原则 : 开放封闭原则# 装饰器的作用 :在不改变原函数的调用方式的情况下,在函数的前后添加功能# 装饰器的本质 : 闭包函数
---------------------------------------------
第一种,最简单的装饰器:
def wrapper(func): def inner(*args,**args): print('在函数运行直线执行') ret = func(*args,**args) print('在函数运行之后执行') return ret return inner
@wrapperdef jack(): print('打印原函数')jack()
第二种,带开关的装饰器
flag = Truedef all(flag): def wa(func): def inner(*args,**kwargs): if flag: #当flag=True 执行装饰器 print('******打印装饰器之前*******') ret = func(*args,**kwargs) return ret else: #当flag=Flase 不执行装饰器,直接返回被装饰函数 ret = func() return ret return inner return wa@all(flag)def aa(): print('第一个函数')aa()@all(flag)def bb(): print('第二个函数')bb()
两个装饰器函数同时装饰一个函数的结果
def wa1(func): def inner1(*args,**kwargs): print('前111111') ret = func(*args,**kwargs) print('后111111') return ret return inner1def wa2(func): def inner2(*args,**kwargs): print('前222222') ret = func(*args,**kwargs) print('后222222') return ret return inner2
运行结果如下:
前111111前222222执行原函数后222222后111111
装饰器之functools
from functools import wrapsdef wrapper(func): #func = holiday @wraps(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 '好开心'print(holiday.__name__)print(holiday.__doc__)ret = holiday(3) #innerprint(ret)