对于带参数的装饰器的实现,我抛砖引玉说一点个人的看法。
在学带参数的装饰器的时候,对嵌套三层才能输入参数感到困惑,觉得隐隐哪里不对,经过一番思绪的整理后我发现如果采用给变量赋值 的方式实现装饰,只需多添加几个参数位 即可。
1. 赋值给变量的方式
**示例:**给做加法和减法的两个参数,增加打印日志的功能
def decorator(fn, flag:str):
def inner(num1, num2):
if flag == "+":
print("--正在努力加法计算--")
elif flag == "-":
print("--正在努力减法计算--")
result = fn(num1, num2)
return result
return inner
def add(a, b):
result = a + b
return result
def sub(a, b):
result = a - b
return result
# 用变量的方式传参
add = decorator(add, '+')
sub = decorator(sub, '-')
result = add(1, 2)
print(result)
"""
--正在努力加法计算--
3
"""
result = sub(1, 2)
print(result)
"""
--正在努力减法计算--
-1
"""
2. 语法糖的方式
而如果采用*@语法糖* 去实现,就需要额外嵌套一个函数,用它去接受参数,并返回一个装饰器
示例:
添加输出日志的功能
def logging(flag):
def decorator(fn):
def inner(num1, num2):
if flag == "+":
print("--正在努力加法计算--")
elif flag == "-":
print("--正在努力减法计算--")
result = fn(num1, num2)
return result
return inner
# 返回装饰器
return decorator
# 使用装饰器装饰函数
@logging("+")
def add(a, b):
result = a + b
return result
@logging("-")
def sub(a, b):
result = a - b
return result
result = add(1, 2)
print(result)
result = sub(1, 2)
print(result)
总结
虽然用赋值给变量的形式可以少嵌套一个函数,但是用语法糖去实现带参数的装饰器就必须嵌套三个函数,否则会报错。