1、装饰器的功能
在不改变原函数的情况下,对原函数的功能进行增强和扩展。
2、装饰器的原理
闭包;嵌套函数,内层函数可以引用外层函数的变量
一定返回的是内层函数的引用
3、定义装饰器
装饰器不传参情况
def test():
print("这是我的原始功能")
def test_plus(func):
def data():
func()
print("这是我的新增功能")
return data
data = test_plus(test)
data()
def test_plus(func):
def data():
func()
print("这是我的新增功能")
return data
@test_plus
def test():
print("这是我的原始功能")
test()
使用语法糖@
4、原函数传参
#原函数传参
#func:原函数 在装饰器中为自由变量
def log(func):
def log_wrapper(*args, **kwargs):
func(*args, **kwargs)
return log_wrapper
@log
def test(arg1, arg2): #定义传递参数类型与个数
print("args" ":", arg1, arg2)
test(1, 2) #调用函数并且传参
#不使用语法糖情况
# log_wrapper = log(test)
# test(1, 2)
args: 1 2
5、装饰器的传参
装饰器一般具有三个函数,要注意关注返回值
建议:写装饰器是时先写返回值
def test_puls(level="INFO"):
def log(func):
def log_wrapper():
print(f"This is {level} log ") #lever为装饰器中自由变量
return log_wrapper
return log
# 装饰器解析
#test_plus函数返回了log函数,log函数返回了log_wrapper,log_wrapper返回了func
# func即为被装饰函数test
@test_puls("Error")
def test():
print("这是装饰器传参")
test()
#不使用语法糖情况
# log = test_puls("Error")
# log_wrapper = log(test)
# log_wrapper()
#流程解析:首先"Error"传参给level,test_plus函数返回了log函数,log函数返回了log_wrapper,log_wrapper返回了func(即test函数)
This is Error log
6、装饰器的应用
一个函数可以有多个装饰器(即添加多个功能)
一个装饰器也可以安装在多个函数上(即多个函数具有同一个装饰器功能)