python装饰器的理解

python装饰器应该算是面试常考到的用点,之前在flask的应用中也是会常常用到,抽空仔细看书查资料理解了下装饰器的概念,通过自己的理解记忆,应该对这个概念会有一个大致上具体的了解。

闭包

说起python装饰器,我们应该不得不谈谈闭包的概念。
我对闭包的理解是,当函数存在嵌套,子函数调用了父函数的变量,那么子函数体加上父函数中调用的变量,那么这时候子函数加上这个调用的变量,就形成了一个闭包。如果子函数没有调用父函数的变量,那么就不存在闭包。我们可以来看一段代码:

In [7]: def fun1():
   ...:     a,b,c = 1,2,3
   ...:     def fun2():
   ...:         x = 1
   ...:         return x+a
   ...:     return fun2
   ...: 

In [8]: foo = fun1()

In [9]: foo()
Out[9]: 2

在这里,fun2fun1中的a形成了一个闭包。每次调用父函数中的值的时候,就会产生一个新的闭包,如果我这里用的是b或者c,那么会产生不一样的闭包。
我们可以发现,在这里,我们传递的是一个整数。当我们传递的是一个函数的时候,那么就成了一个装饰器。装饰器的本质就是函数闭包,利用了函数闭包的特性

装饰器

In [3]: def decorator(func):
   ...:     def wrapped():
   ...:         print "{} is running".format(func.__name__)
   ...:         return func()
   ...:     return wrapped
   ...: 

In [4]: def foo():
   ...:     print "I'm the function"
   ...:     

In [5]: wrapped_func = decorator(foo)

In [6]: wrapped_func()
foo is running
I'm the function

在这里decorator就是装饰器,它将func包装起来这里的代码相当繁琐,这时候我们可以用python的语法糖来进行修饰@。代码如下

In [9]: @decorator
   ...: def bar():
   ...:     print "I'm the guy"
   ...:     
In [11]: bar()
bar is running
I'm the guy

这里只是简单的装饰器的用法,后续还会讨论分析其他的用法

参考

知乎:如何理解Python装饰器
深入浅出Python装饰器

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 呵呵!作为一名教python的老师,我发现学生们基本上一开始很难搞定python的装饰器,也许因为装饰器确实很难懂...
    TypingQuietly阅读 19,599评论 26 186
  • 本文为《爬着学Python》系列第四篇文章。从本篇开始,本专栏在顺序更新的基础上,会有不规则的更新。 在Pytho...
    SyPy阅读 2,519评论 4 11
  • Python的装饰器的英文名叫Decorator,要对一个已有的模块做一些“修饰工作”,所谓修饰工作就是想给现有的...
    Spareribs阅读 679评论 1 11
  • 原文出处: dzone 译文出处:Wu Cheng(@nullRef) 1. 函数 在python中,函数通过...
    DraculaWong阅读 540评论 0 3
  • 我的家乡有什么 让我想一想 是否还能记忆起曾经的模样 偷偷爬过的树 翻过的墙 逮过的鱼 摘过的花 记不清 家门前小...
    乐迷阅读 373评论 0 1