PythonTip >> 博文 >> python

Python中的装饰器Decorator

zihua 2014-01-20 23:01:48 点击: 789 | 收藏


01defmakebold(fn):

02defwrapped():

03return“<b>”+fn() +“</b>”

04returnwrapped

05

06defmakeitalic(fn):

07defwrapped():

08return“<i>”+fn() +“</i>”

09returnwrapped

10

11@makebold

12@makeitalic

13defhello():

14return“hello world”

15

16printhello() ## 返回 <b><i>hello world</i></b>

其中的@其实就是Python的装饰器。

装饰器模式可以在不影响其它对象的情况下,以动态、透明的方式给单个对象添加职责,也能够处理那些可以撤销的职责。经常用于日志记录、性能测试等场合。

想象一下这个很常见的场景,你写了一个方法只提供给以登陆的用户访问,你可以写以下代码:

1defA():

2ifuser.is_login():

3dosomething

4else:

5pass

这当然没什么问题,但是你又写了一个方法B,也要求只有登录用户可以访问,于是有写了以下代码:

1def B():

2ifuser.is_login():

3dosomething

4else:

5pass

问题出来了,如果不是两个方法而是一堆方法,你可能就有点受不了啦。当然聪明的你可以想出这个方法:

你可能没有想到,对于这么好用的东西,python优雅的支持,这就是@修饰符:

在方法A上边写一个@修饰符,调用方法A的时候会调用修饰符后边的方法B,方法B以A方法为参数,而且需要返回一个可调用的对象,这个可调用的对象会使用A方法提供的参数执行。看这个例子:

01#!/usr/bin/env python 

02

03defa(fn):

04print‘a’

05defd(st):

06printst+‘d’

07returnd

08

09def b(fn):

10print‘b’

11returnfn

12

13@a

14@b

15defc(st):

16printst

17

18c(‘c’)

输出结果是:bacd

我们调用c(‘c’)的时候会先调用b(c),b(c)打印字符”b”然后返回c,然后再调用a(c),a(c)打印字符”a”,然后返回方法d,然后再执行d(‘c’),打印cd。

参考资料:http://blog.csdn.net/shangzhihaohao

原文链接:http://www.wumii.com/item/a2jH5cFW

作者:zihua | 分类: python | 标签: python | 阅读: 789 | 发布于: 2014-01-20 23时 |