python 解释器
来源:互联网 发布:淘宝海报在线制作 编辑:程序博客网 时间:2024/05/22 04:45
看过python关于解释器这一章,照葫芦也能画个瓢,但在什么时候用我还是不太明白,下面这篇文章关于解释器的解释,我是比较明白为什么要用解释器的,转载过来以免忘记。以后真正弄明白解释器之后再写一篇专题。
装饰器模式可以在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责,也能够处理那些可以撤销的职责。经常用于日志记录、性能测试等场合。
想象一下这个很常见的场景,你写了一个方法只提供给以登陆的用户访问(事实上我也是通过django的@login_required才了解到@修饰符的),你可以写以下代码:
- def A():
- if user.is_login():
- do something
- else:
- pass
def A(): if user.is_login(): do something else: pass
这当然没什么问题,但是你又写了一个方法B,也要求只有登录用户可以访问,于是有写了以下代码:
- def B():
- if user.is_login():
- do something
- else:
- pass
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)
def A(): passdef B(): passdef login_required(fn): def ff(): if user.is_login(): fn() else: pass return ffA = 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
def login_required(fn): def ff(): if user.is_login(): fn() else: pass return ff@login_requireddef A(): pass@login_requireddef 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')
#!/usr/bin/env pythondef a(fn): print 'a' def d(st): print st+'d' return ddef b(fn): print 'b' return fn@a@bdef c(st): print st c('c')
输出结果:bacd
我们调用c('c')的时候会先调用b(c),b(c)打印字符"b"然后返回c,然后再调用a(c),a(c)打印字符"a",然后返回方法d,然后再执行d('c'),打印cd。
0 0
- 配置Python解释器
- 解释器模式(python)
- python 解释器
- Python解释器
- Python解释器
- 安装python解释器
- python调用解释器
- python解释器
- Python解释器
- python指定解释器
- Python解释器
- python交互式解释器
- 使用python解释器
- Python解释器
- Python---- 编译器,解释器
- Python-解释器
- Python解释器
- Python解释器
- ZOJ3800 GCD+离线线段树
- hdu 4777 Rabbit Kingdom (离线树状数组)
- Android Touch事件分发过程
- 【小猿說】国内移动互联网现状令人欣慰
- echarts学习笔记(4) ---- 如何使用 formatter 和 grid 这两把利器
- python 解释器
- grub 硬盘安装系统
- JAVA编程思想(4) - 多态(三)
- 转载!!!Hibernate插入和修改数据到数据库中时不修改存在默认值字段
- python http请求及cookie的模拟
- 数据段、代码段、堆栈段、BSS段的区别
- JavaScript eval()函数
- IE8兼容IE7
- tomcat下server.xml中context介绍