由前面的学习内容可以知道装饰器的外部函数能接受一个类型为函数的参数。即引用被装饰的函数。
那么装饰器的外部函数能不能直接传递其他的参数呢?
答案是:不能。
代码如下:def decorator(fn, flag):
def inner(num1, num2):
if flag == "+":
print("--正在努力加法计算--")
elif flag == "-":
print("--正在努力减法计算--")
result = fn(num1, num2)
return result
return inner
@decorator('+')
def add(a, b):
result = a + b
return result
result = add(1, 3)
print(result)
这里运行之后,会报错。那要怎样才能实现装饰器里面传递参数呢?
在装饰器的最前面再加上一个函数,这个函数里面可以传参。代码如下:# 带有参数的装饰器,要在装饰器前面加上一个函数,结束的时候返回一个函数
def log(n):
def test(fun):
def inner(num1, num2):
if n == "+":
print("正在计算加法。")
return fun(num1, num2)
if n == "-":
print("正在计算减法")
return fun(num1, num2)
return inner
return test
def sum_num(num1,num2):
result = num1 + num2
return result
test = log("+")
sum_num = test(sum_num)
@log("-")
def sub_num(num1,num2):
result = num1 - num2
return result
rs = sum_num(20, 10)
print(rs)
rs1 = sub_num(20, 10)
print(rs1)
这样就能在装饰器里面传递其他的参数了。
注意点:调用装饰器后@后要调用最外部的那个函数,不再是之前的那个函数了。
一定要返回之前的那个装饰器函数的引用。