Tag Archives: Decorator

当初看 Dive into Python 的时候就听过装饰器,不过知道是个语法糖,感觉上没什么用,就没仔细了解,这几天看一段代码用到了装饰器,只好再研究下吧。

为什么使用装饰器?

AstralWind 在他的博客里这么说,“装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。”

打个比方,我是个有怪癖的人,在调用任何函数的时候总希望先输出函数的name和doc,因为我常常反复传递函数,所以最好把这个函数的引用计数也显示下?要么把函数运行时间也显示出来吧!

如果不用装饰器,我们可能在写函数的时候把name、doc什么的都print出来,这样有些麻烦,写多少个函数就得copy多少次,利用Python万物皆对象的特性,我们不妨写个函数来做这件事情:

不过这样在调用函数的时候总得先把函数传给PrintDetail(),既不美观也不方便,那么是时候让装饰器登场了:

这里我们定义了装饰器,不过,等等,我运行完发现怎么我还没调用func,他就运行了?
上面这个装饰器是不合格的,如果你尝试去掉用的话,甚至会发现装饰器只会调用一次。
这是因为我们还没弄清楚究竟什么时装饰器,我先提供一个正确的装饰器:

为什么要提供_PrintDetail,而且还要把它返回?
为什么现在看起来就不会没调用自动运行?
为什么现在多次运行都可以自动调用装饰器了?

虽然没有读过Python关于这部分的源码,但是大概可以推测出Python涉及到装饰器时怎么工作的:
Read More →