zoukankan      html  css  js  c++  java
  • @修饰符--python中的装饰器

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

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

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


    这当然没什么问题,但是你又写了一个方法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。

  • 相关阅读:
    自动化系列-pyppeteer安装
    用python做一个可视化生成二维码的工具
    Python第三方包之DingDingBot
    封装属于自己的Python包
    sqlldr使用
    MS MQ 消息队列
    PDF打印
    oracle 存储过程编辑 卡死
    winrar 压缩文件方法
    数值 转换 成 带千位符的数值,且转成大写
  • 原文地址:https://www.cnblogs.com/guke/p/3839758.html
Copyright © 2011-2022 走看看