装饰器
不想修改函数的调用方式,但还是想在原来的函数前后添加功能
装饰器就是对一个函数,有一些装饰作用
本质是闭包
原则:开放封闭原则
开放:对扩展是开放的
封闭:对修改时封闭的
from functools import wraps #如果导入了wraps,并调用装饰func,
#那么后面的func还是原来的func,不再是inner的内存地址
def wrapper(f): #装饰器函数 func
@wrap(func)
def inner(*args, **kwargs):
# 在被装饰函数之前要做的事
ret = f(*args, **kwargs) #被装饰函数
# 在被装饰函数之后要做的事
return ret
return inner
@wrapper #语法糖 @装饰器函数名 相当于 func = wrapper(func)
def func():
pass
ret = func() #inner
带参数的装饰器(三层)
利用一个标识去控制多个装饰器
flage = True
def wrapper_cont(flag):
def wrapper(f):
def inner(*args, **kwargs):
if flag:
# 在被装饰函数之前要做的事
ret = f(*args, **kwargs) #被装饰函数
# 在被装饰函数之后要做的事
return ret
else:
ret = f(*args, **kwargs) #被装饰函数
return ret
return inner
return wrapper
@wrapper_cont(flage) #@wrapper = wrapper_cont(flage)
def func():
pass
@wrapper_cont(flage)
def funcn():
pass
ret = func()