# 装饰器的进阶
# functools.wraps
# 带参数的装饰器
# 多个装饰器装饰同一个函数
# 周末的作业
# 文件操作
# 字符串处理
# 输入输出
# 流程控制
# 装饰器
# 开发原则 : 开放封闭原则
# 装饰器的作用 :在不改变原函数的调用方式的情况下,在函数的前后添加功能
# 装饰器的本质 : 闭包函数
---------------------------------------------
第一种,最简单的装饰器:
def wrapper(func):
def inner(*args,**args):
print('在函数运行直线执行')
ret = func(*args,**args)
print('在函数运行之后执行')
return ret
return inner
@wrapper
def jack():
print('打印原函数')
jack()
第二种,带开关的装饰器
flag = True
def 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 inner1
def 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 wraps
def 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) #inner
print(ret)