zoukankan      html  css  js  c++  java
  • python装饰器

    参考:
    装饰器 http://www.cnblogs.com/wupeiqi/articles/4980620.html
    生成器generator生成迭代器iterrator http://www.cnblogs.com/alex3714/articles/5765046.html


    用法:
    @+装饰器函数名
    被装饰的函数名和函数体
    功能:
    将被装饰的函数名作为传入参数传给装饰器函数
    装饰器函数的返回值是被包裹的函数名,该返回值赋值给被装饰的函数(原来的函数在这时整个不执行了)

    一种通用的装饰器用法:
    def w1(func):
        def inner(*args,**kwargs):
            # 验证1
            # 验证2
            # 验证3
            return func(*args,**kwargs)
        return inner
     
    @w1
    def f1(arg1,arg2,arg3):
        print 'f1'

    问题:一个函数可以被多个装饰器装饰吗?可以!

    def w1(func):
        def inner(*args,**kwargs):
            # 验证1
            # 验证2
            # 验证3
            return func(*args,**kwargs)
        return inner
     
    def w2(func):
        def inner(*args,**kwargs):
            # 验证1
            # 验证2
            # 验证3
            return func(*args,**kwargs)
        return inner
     
     
    @w1
    @w2
    def f1(arg1,arg2,arg3):
        print 'f1'

    问题:更厉害的装饰器?如下:事前装饰+函数+事后装饰

    def Before(request,kargs):
        print 'before'
          
    def After(request,kargs):
        print 'after'
      
    def Filter(before_func,after_func):
        def outer(main_func):
            def wrapper(request,kargs):
                  
                before_result = before_func(request,kargs)
                if(before_result != None):
                    return before_result;
                  
                main_result = main_func(request,kargs)
                if(main_result != None):
                    return main_result;
                  
                after_result = after_func(request,kargs)
                if(after_result != None):
                    return after_result;
                  
            return wrapper
        return outer
          
    @Filter(Before, After)
    def Index(request,kargs):
        print 'index'

    用一张图来解释语句的执行顺序,如下:

    上述的装饰器虽然已经完成了其应有的功能,即:装饰器内的函数代指了原函数,注意其只是代指而非相等,原函数的元信息没有被赋值到装饰器函数内部。例如:函数的注释信息
    如果使用@functools.wraps装饰装饰器内的函数,那么就会代指元信息和函数。如下:
    def outer(func):
        @functools.wraps(func)
        def inner(*args, **kwargs):
            print(inner.__doc__)  # None
            return func()
        return inner
    
    @outer
    def function():
        """
        asdfasd
        :return:
        """
        print('func')
    
    
    
  • 相关阅读:
    vm串口问题
    web测试和一般的应用程序测试的主要区别
    测试点总结<转>
    【转】.net正则表达式基础学习
    QTP场景恢复详解
    QTP之检查点实例操作(转载)
    Java使用JNI调用第三方dll动态链接库
    Android 2.2播放mp4视频提示“是无效的流媒体”的问题
    FileSystemWatch 对文件的监测 修改 创建 删除 并写入日志
    WinForm程序开机自动运行
  • 原文地址:https://www.cnblogs.com/huamingao/p/5888037.html
Copyright © 2011-2022 走看看