• 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')
    
    
    
  • 相关阅读:
    【IoT平台北向API调用】使用Postman调用Https接口
    【LiteOS】LiteOS移植常见问题
    搞IT产品,请谨记Mobile First
    Modelarts与无感识别技术生态总结(浅出版)
    高性能Web动画和渲染原理系列(1)——CSS动画和JS动画
    使用蓝图构建Flask项目目录
    一统江湖的大前端(8)- velocity.js 运动的姿势(上)
    只需两步手把手教你玩转图像识别
    秉承初心,砥砺奋进!华为云助力锦江都城开启云服务时代
    HBase 索引创建
  • 原文地址:https://www.cnblogs.com/huamingao/p/5888037.html
Copyright © 2020-2023  润新知