闭包:一个函数,其参数和返回值都是函数
- 用于增强方法功能
- 面向切面编程(AOP)
例如:
我们实现一个查找0-100中的所有奇数(重要)并统计时间(次要)的需求
上面方法按功能能分成三个部分
- 起始时间
- 主要逻辑——查找奇数
- 统计时间
执行结果:
我们现在想一下,把查找奇数和统计时间放在一个方法中(耦合),那么这两个功能任意一个出了问题,都要复查所有代码,修改起来会很麻烦。
那我们先把代码改成这样:
可以看到,我把两个功能——统计时间和查找奇数定义成了两个方法,分别为count_time和print_odds。可以看到,count_time方法我传入的参数是一个方法名。这样两个方法之间就会互不干扰。
但是上面方法有一些缺点,就是最后我是用统计时间count_time方法执行了整个需求,按理说在重要性上应该是查找奇数>统计时间的,而且执行的时候应该在main函数中只要执行print_odds方法是最好的。
所以我们把代码改成:
先来分析main
函数,我们先把print_odds
名赋值了新的方法,也就是说当我们最后执行print_odds
方法时,其实这已经是一个新的函数了,只是名字一样,但其实已经完全可以换个名字了。这样的好处就是不需要修改print_odds
方法,但是增强了这个方法的功能。
然后我们看count_time_wapper
方法,本质是在count_time_wapper
方法中嵌入了另一个improve_func
方法,而在improve_func
方法中调用了参数func
,调用方式是在func
后面加了了括号()
,也就是说传过来的是方法名,在后面加上括号以后就成了让这个方法执行了。
最后count_time_wrapper
返回的是一个方法名,这个方法名正是内嵌函数名,这样就形成了一个闭包。
可是不能每次执行print_odds
以前都要先给他赋值,所以我们引入装饰器: