浅谈python装饰器

假设我们想增强一个函数得功能,但是我们又不想修改这个函数,所以我们就要想办法用另外的方式改良它,我们就把这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。本质上,decorator就是一个返回函数的高阶函数。

谈到装饰器之前我们先提一个概念,闭包。



这就是闭包得概念,那么闭包有什么用呢?
闭包就是装饰器中非常重要得一环。

举个例子,我们我们定义一个能打印日志的decorator

def log(func):
    def wrapper(*args, **kw):
        print 'call %s():' % func.__name__
        return func(*args, **kw)
    return wrapper

观察上面的log,因为它是一个decorator,所以接受一个函数作为参数,并返回一个函数。我们要借助Python的@语法,把decorator置于函数的定义处:

@log
def now():
    print '2013-12-25'

调用now()函数,不仅会运行now()函数本身,还会在运行now()函数前打印一行日志:

>>> now()
call now():
2013-12-25

把@log放到now()函数的定义处,相当于执行了语句: now = log(now)

由于log()是一个decorator,返回一个函数,所以,原来的now()函数仍然存在,只是现在同名的now变量指向了新的函数,于是调用now()将执行新函数,即在log()函数中返回的wrapper()函数。

wrapper()函数的参数定义是(*args, **kw),因此,wrapper()函数可以接受任意参数的调用。在wrapper()函数内,首先打印日志,再紧接着调用原始函数。

博客文章例子摘自廖雪峰python教程

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

推荐阅读更多精彩内容

  • 函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确...
    齐天大圣李圣杰阅读 5,412评论 0 2
  • 要点: 函数式编程:注意不是“函数编程”,多了一个“式” 模块:如何使用模块 面向对象编程:面向对象的概念、属性、...
    victorsungo阅读 5,499评论 0 6
  • 婚姻嫁娶,对辛苦了一辈子的农民来说无疑是人生大事,举全家之力,务必办好。现在婚礼的形式越来越西化,可是还有一些小细...
    微雨下燕双飞阅读 3,701评论 0 0
  • 这一节说的简直就是废话。 大多数框架类方法就是让你直接调用的,有一些就是让你去实现的,这就是废话。 如果你调用了父...
    Stroman阅读 861评论 0 0
  • 越长大,越明白 爱不是刹那间的火花,而是天上的星辉 爱不是一眼万年,而是万年如初见 爱,不仅仅是一个动词,还是一种...
    郭恒在阅读 1,235评论 0 0