python——装饰器和语法糖效果

装饰器和闭包有很大的相关性,可以这么说,就是当外部函数后面的参数填入的是另一个函数的名称时(并且最多只能有一个参数),称之为装饰器,也可以说装饰器就是特殊的闭包。
可以用如下方法进行分析:

def decorator(func):
    def inner(a):
        print('this is a new method')
        func(a)
    return inner


def add_1(num):
    res = num + 1
    print(res)

# add_1后面一定不能带括号,带括号代表执行了方法
end = decorator(add_1)
end(1)

这里输出的结果是:
在这里插入图片描述
这里就实现了没有改变add_1函数的代码,给该函数增加了一个功能:this is a new method,这就是装饰器的作用,给别的函数增加额外功能而不改变别的函数的代码。
现在做具体的debug分析:
在执行具体命令之前,这两个函数对象已经存储在了内存当中:
在这里插入图片描述
下来开始执行end = decorator(add_1)任务(这一步就是关键的装饰环节):
在这里插入图片描述
在这里插入图片描述
再执行最后一行命令:end(1)
这时直接步入inner函数,说明这时候的end相当于inner对象,而且此时func已经将add_1函数存入:
在这里插入图片描述
先执行打印,再执行func(a)
在这里插入图片描述
执行func(a)时步入add_1函数:
在这里插入图片描述
将结果打印输出,此时func(a)代码执行完毕,end(1)也执行完毕输出结果:
在这里插入图片描述

语法糖效果

如果每次装饰函数都要写一个装饰的代码(即end = decorator(add_1)),会略显麻烦,此时我们可以通过下述方法简化代码:

def decorator(func):
    def inner(a):
        print('this is a new method')
        func(a)
    return inner


@decorator
def add_1(num):
    res = num + 1
    print(res)


# add_1后面一定不能带括号,带括号代表执行了方法
add_1(1)

@加装饰器名字即可,输出与第一个示例输出一样。
可以用debug模式下的一个关键步骤解释该语法糖:
在这里插入图片描述
在执行add_1(1)这个命令时add_1函数已经成为了一个decorator.inner对象,此时执行的第一步直接是如下步骤:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

graceful coding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值