python反射、闭包、装饰器_python进阶–闭包和装饰器

由前面的学习内容可以知道装饰器的外部函数能接受一个类型为函数的参数。即引用被装饰的函数。

那么装饰器的外部函数能不能直接传递其他的参数呢?

答案是:不能。

代码如下: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)

这样就能在装饰器里面传递其他的参数了。

注意点:调用装饰器后@后要调用最外部的那个函数,不再是之前的那个函数了。

一定要返回之前的那个装饰器函数的引用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值