携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第10天,点击查看活动详情
0 环境
- 编辑器:idea或vscode
- 系统版本:windows10
- python版本:3.9.6
1 前言
很少听人说高阶函数(有个条件:函数作为返回值),但闭包我们肯定不会陌生的吧,这是高阶函数的一个应用场景,用来保存部分变量,并且不暴露出去的那种。好比买了个手机,然后收到的快递包裹,正常一个外包装,里面真实的手机包装。有了这个概念,学装饰器会更加容易。
2 定义
定义网上太多了,就不具体说了,直接上代码,如下代码:只要看它的大致结构,比如看它的返回值和入参,具体逻辑先忽略掉,对于logger函数来说,入参是函数,返回给它的值也是函数(这不是高阶函数的两大特点嘛)。先mark下这两个点。
def logger(fn):
def wrap(*args, **kwargs):
print("call {}".format(fn.__name__))
ret = fn(*args, **kwargs)
print("{} called".format(fn.__name__))
return ret
return wrap
那我们怎么去调用这个函数呢,如下代码:定义一个匿名函数,实现的是返回两个值之和,并将该匿名函数传给add的变量,logger的入参接收该add函数后传给变量logged_add,logged_add传入两个值,得到最终相加的和。
add = lambda x, y : x + y
logged_add = logger(add)
print("logged_add -->", logged_add)
print(logged_add(2, 12))
最终的运行结果如下图:
3 总结
突然函数里套函数,以及传参也是函数,想必被绕晕了吧,多多少少会吐槽,它出现的目的或者意义何在,肯定有人会不理解了,我本来只是想相加一下,给我整那么绕干嘛,说明学习装饰器的时候还没到,你现在不需要它,可以先缓缓,继续往下学,毕竟可以选择不用装饰器,也是么问题的,等当你真正需要的时候,你在去看它,就知道它的意义了,自然也就学会了,但是为了代码自由,还是要知道下它的定义的。至于应用方面,假设你想知道执行add相加前是什么时间点的,以及执行add相加完成后是什么时间点,这时候装饰器的好处就来了。其实装饰器有点aop的味道。现实中七夕节的花(不探讨啥心意什么的情况下),那外包装精美的一批,从某种层度来说,它就是装饰器,装饰这朵花。