Python装饰器详解

2022-02-23 16:41:59 浏览数 (1)

闭包:一个函数,其参数和返回值都是函数

  • 用于增强方法功能
  • 面向切面编程(AOP)

例如:

我们实现一个查找0-100中的所有奇数(重要)并统计时间(次要)的需求

上面方法按功能能分成三个部分

  1. 起始时间
  2. 主要逻辑——查找奇数
  3. 统计时间

执行结果:

我们现在想一下,把查找奇数和统计时间放在一个方法中(耦合),那么这两个功能任意一个出了问题,都要复查所有代码,修改起来会很麻烦。

那我们先把代码改成这样:

可以看到,我把两个功能——统计时间和查找奇数定义成了两个方法,分别为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以前都要先给他赋值,所以我们引入装饰器:

0 人点赞