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')
    
    
    
  • 相关阅读:
    将字典或者数组转换成JSON数据或者字符串
    [翻译] VICMAImageView
    [翻译] TransitionKit
    [翻译] UIGlossyButton
    [翻译] MMMaterialDesignSpinner
    [翻译] AFSoundManager
    实现UIView的无限旋转动画(非CALayer动画)
    【转】Winform 去掉 最大化 最小化 关闭按钮(不是关闭按钮变灰)终极解决办法
    【转】C# winform 安装程序打包(自定义操作)
    【转】C#安装包(自动卸载低版本)
  • 原文地址:https://www.cnblogs.com/huamingao/p/5888037.html
Copyright © 2011-2022 走看看