python 解释器

看过python关于解释器这一章,照葫芦也能画个瓢,但在什么时候用我还是不太明白,下面这篇文章关于解释器的解释,我是比较明白为什么要用解释器的,转载过来以免忘记。以后真正弄明白解释器之后再写一篇专题。




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

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

  1. def A():  
  2.     if user.is_login():  
  3.         do something  
  4.     else:  
  5.         pass  
def A():
    if user.is_login():
        do something
    else:
        pass

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

  1. def B():  
  2.     if user.is_login():  
  3.         do something  
  4.     else:  
  5.         pass  
def B():
    if user.is_login():
        do something
    else:
        pass

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

  1. def A():  
  2.     pass  
  3. def B():  
  4.     pass  
  5. def login_required(fn):  
  6.     def ff():  
  7.         if user.is_login():  
  8.             fn()  
  9.         else:  
  10.             pass  
  11.     return ff  
  12.   
  13. A = login_required(A)  
  14. B = login_required(B)  
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优雅的支持,这就是@修饰符 

  1. def login_required(fn):  
  2.     def ff():  
  3.         if user.is_login():  
  4.             fn()  
  5.         else:  
  6.             pass  
  7.     return ff  
  8.  
  9. @login_required  
  10. def A():  
  11.     pass 
  12. @login_required  
  13. def B():  
  14.     pass  
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方法提供的参数执行。看这个例子:

  1. #!/usr/bin/env python   
  2.   
  3. def a(fn):  
  4.     print 'a'  
  5.     def d(st):  
  6.         print st+'d'  
  7.     return d  
  8.   
  9. def b(fn):  
  10.     print 'b'  
  11.     return fn  
  12.  
  13. @a 
  14. @b  
  15. def c(st):  
  16.     print st  
  17.       
  18. c('c')  
#!/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。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值