@修饰符--python中的装饰器

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

http://blog.csdn.net/shangzhihaohao/article/details/6928808

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

想象一下这个很常见的场景,你写了一个方法只提供给以登陆的用户访问(事实上我也是通过django的@login_required才了解到@修饰符的),你可以写以下代码:

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

defB():ifuser.is_login():

do somethingelse:pass

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

defA():passdefB():passdeflogin_required(fn):defff():ifuser.is_login():

fn()else:passreturnff

A=login_required(A)

B= login_required(B)

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

deflogin_required(fn):defff():ifuser.is_login():

fn()else:passreturnff

@login_requireddefA():pass@login_requireddefB():pass

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

#!/usr/bin/env pythondefa(fn):PRint'a'defd(st):printst+'d'returnddefb(fn):print'b'returnfn

@a

@bdefc(st):printst

c('c')

输出结果:bacd

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

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航