@修饰符--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中的装饰器decorator
python中的装饰器 装饰器是为了解决以下描述的问题而产生的方法 我们在已有的函数代码的基础上,想要动态的为这个函数增加功能而又不改变原函数的代码 例如有三个函数: def f1(x): retur ...
- 简单说明Python中的装饰器的用法
简单说明Python中的装饰器的用法 这篇文章主要简单说明了Python中的装饰器的用法,装饰器在Python的进阶学习中非常重要,示例代码基于Python2.x,需要的朋友可以参考下 装饰器对与 ...
- 【Python】python中的装饰器——@
对装饰器本来就一知半解的,今天终于弄清楚了,Python中的装饰器是对装饰者模式的很好运用,简化到骨子里了. python中为什么需要装饰器,看这里:http://www.cnblogs.com/hu ...
- Python 中实现装饰器时使用 @functools.wraps 的理由
Python 中使用装饰器对在运行期对函数进行一些外部功能的扩展.但是在使用过程中,由于装饰器的加入导致解释器认为函数本身发生了改变,在某些情况下——比如测试时——会导致一些问题.Python 通过 ...
- 写python中的装饰器
python中的装饰器主要用于在已有函数实现功能前附加需要输出的信息,下面将用实例展示我如何写装饰器. 首先分别尝试写装饰器装饰一个无参函数和一个有参函数(被装饰函数仅输出,无返回值情况下) def ...
- python中@property装饰器的使用
目录 python中@property装饰器的使用 1.引出问题 2.初步改善 3.使用@property 4.解析@property 5.总结 python中@property装饰器的使用 1.引出 ...
- 【Python】解析Python中的装饰器
python中的函数也是对象,函数可以被当作变量传递. 装饰器在python中功能非常强大,装饰器允许对原有函数行为进行扩展,而不用硬编码的方式,它提供了一种面向切面的访问方式. 装饰器 一个普通的装 ...
- 三分钟搞定Python中的装饰器
python的装饰器是python的特色高级功能之一,言简意赅得说,其作用是在不改变其原有函数和类的定义的基础上,给他们增添新的功能. 装饰器存在的意义是什么呢?我们知道,在python中函数可以调用 ...
- Python 中的装饰器
说到装饰器是我们每个学Python人中的心痛. 装饰器作用:是用来装饰其他函数的,为其他函数添加新功能. 原则:1.不能改变被修饰函数的源代码. 2.不能修改被修饰函数的调用方式. 学装饰器前还需要了 ...
随机推荐
- Web服务器控件表
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAykAAAFRCAIAAAD/5nW4AAAgAElEQVR4nOydd3gVxfrHN6TXQ0KXEn
- Vue.js学习 Item9 – 表单控件绑定
基础用法 可以用 v-model 指令在表单控件元素上创建双向数据绑定.根据控件类型它自动选取正确的方法更新元素.尽管有点神奇,v-model 不过是语法糖,在用户输入事件中更新数据,以及特别处理一些 ...
- Sliverlight中PagedCollectionView的使用
最近项目中一直在和PagedCollectionView这个类打交道.通过它,我们可以以分页的形式自动处理并显示集合中的片段,尤其是和Pager控件配合的时候更能彰显其威力. PagedColecti ...
- 删除linux系统服务
#删除服务的命令,[ServiceName]需要替换为实际的服务名称 sudo update-rc.d [ServiceName] remove 有时候安装sysv-rc-conf进行服务控制,但是在 ...
- 用Python的smtp模块发邮件的示例
# -*- coding: UTF-8 -*- import smtplib from email.mime.multipart import MIMEMultipart from email.mim ...
- 14.python中的集合
什么是集合?正如其字面的意思,一堆东西集中合并到一起.乍一听貌似和容器没什么差别,嗯,好吧,集合也算是一种容器. 在学习这个容器有什么不同之前,先看看集合是如何创建的: a = set() #可变集合 ...
- ios 总结
1 ocoa Touch Layer{ App Extensions https://developer.apple.com/library/ios/documentation/General/Con ...
- [php]如何更改wamp默认的mysq空密码?
最近刚开始学php,爬坑中.上午看了会儿书,下了个源码,把文件部署到www下之后,也导入了sql文件,但是进入之后显示 = = 一开始不知道是什么.后来百度之后发现是mysql的问题,应该是源码中p ...
- Java 逻辑运算符、位运算符、移位操作符 总结(Java 学习中的小记录)
Java 逻辑运算符.位运算符.移位操作符 总结 作者:王可利(Star·星星) 逻辑运算符,表格如下: 解析逻辑运算符表: 1.与 (&) 特点:两个都为真的时候,结果为真.两个为 ...
- C/C++ 对常见字符串库函数的实现
在c中的string.h头文件中存在很多对字符串进行操作的函数,利用这些函数可以方便的对字符串进行操作.下面将对常见的字符串函数进行解释和实现. strcpy 函数原型:char* _strcpy(c ...