@修饰符--python中的装饰器
2015-09-28 18:10
639 查看
装饰器模式可以在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责,也能够处理那些可以撤销的职责。经常用于日志记录、性能测试等场合。
想象一下这个很常见的场景,你写了一个方法只提供给以登陆的用户访问(事实上我也是通过django的@login_required才了解到@修饰符的),你可以写以下代码:
这当然没什么问题,但是你又写了一个方法B,也要求只有登录用户可以访问,于是有写了以下代码:
问题出来了,你在复制粘贴,如果不是两个方法而是一堆方法,你可能就有点受不了啦。当然聪明的你可以想出这个方法:
你可能没有想到,对于这么好用的东西,python优雅的支持,这就是@修饰符
想象一下这个很常见的场景,你写了一个方法只提供给以登陆的用户访问(事实上我也是通过django的@login_required才了解到@修饰符的),你可以写以下代码:
def A(): if user.is_login(): do something else: pass
这当然没什么问题,但是你又写了一个方法B,也要求只有登录用户可以访问,于是有写了以下代码:
def B(): if user.is_login(): do something else: pass
问题出来了,你在复制粘贴,如果不是两个方法而是一堆方法,你可能就有点受不了啦。当然聪明的你可以想出这个方法:
def A(): pass def B(): pass def login_required(fn): def ff(): if user.is_login(): fn() else: pass return ff A = login_required(A) B = login_required(B)
你可能没有想到,对于这么好用的东西,python优雅的支持,这就是@修饰符
def login_required(fn): def ff(): if user.is_login(): fn() else: pass return ff @login_required def A(): pass @login_required def B(): pass在方法A上边写一个@修饰符,调用方法A的时候会调用修饰符后边的方法B,方法B以A方法为参数,而且需要返回一个可调用的对象,这个可调用的对象会使用A方法提供的参数执行。看这个例子:
#!/usr/bin/env python def a(fn): print 'a' def d(st): print st+'d' return d def b(fn): print 'b' return fn @a @b def c(st): print st c('c')输出结果:bacd我们调用c('c')的时候会先调用b(c),b(c)打印字符"b"然后返回c,然后再调用a(c),a(c)打印字符"a",然后返回方法d,然后再执行d('c'),打印cd。
相关文章推荐
- Python 脚本学习笔记(五)集中式病毒扫描,端口扫描以及分段数据库操作
- Python 脚本学习笔记(五)集中式病毒扫描,端口扫描以及分段数据库操作
- python 抓取美女图片
- 【Python】【解决】UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 1: ordinal not in r
- python中格式化字符串
- Python-other-1
- Python 初识Pandas- Python Data Analysis Library
- python 用户登录, 锁定。多用户
- 利用Python的科学计算包scipy画Quantile-Quantile图
- Django+python+BeautifulSoup垂直搜索爬虫
- python-requests快速上手
- 用Python学习统计学基础-5
- python [1:3]
- Python 遍历文件夹中的指定类型文件
- python基础语法(4)
- python基础语法(3)
- python基础语法(2)
- HMAC-SHA1各语言版本实现
- python基础语法(1)
- eclipse+Python搭建