打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Python装饰器详解

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

    • 用于增强方法功能

    • 面向切面编程(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以前都要先给他赋值,所以我们引入装饰器:

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
Python装饰器
python入门必学之装饰器,(附例子和详细说明)手把手教分分钟学会
【Python之路】特别篇
采用__call__ 实现装饰器模式
Python进阶 列表推导式详解总结
Python自学教程第2期-求100以内奇数和
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服