装饰器(decorator)

装饰器在python用的较多,如 @staticmethod @classmethod @property @inlineCallback @gen @asynchronous .. 只要理解一下就行了,自己用的少,别人框架代码用的多,以下简单讲一下decorator


  • decorator用在函数定义前,重新装饰一下函数
  • 以下示例都以函数装饰器为例(因为class只要实现__call__方法,就可以和函数一样可调用) 
    # -*- coding: utf-8 -*-
    
    # demo1 一个简单的decorator, decorator没有处理被装饰函数的参数
    
    """生成器原型
    定义一个decorator函数 
    """
    def deco(func): # func是被装饰的函数
        # do something                             
        # 这部分是decorator附加的代码, 完成一部分功能  
        print "decorator do something"             #*1
        
        return func # 再返回被装饰的函数 
    
    # 如上是decorator原型,多做了*1 这部分代码的功能
    
    @deco    # decorator用在函数定义上, 用上以后,就被decorator装饰了, 多了deco函数 #*1 那部分功能了 
    def myfun(x):
        print "myfun", x
    
    
    if __name__ == "__main__":
        myfun(2)    # 其实就是: deco(myfun)(2)
    """ result:
    decorator do something
    myfun 2 
    """
        
    # 以上:其实decorator就是语法糖, decorator原型部分是被封装起来的, 用的时候直接@deco..就行了, 这个c的函数指针(回调)没区别
    
    # -------------------------------------------------------------------------------------------------------------
    
    # demo2 decorator可以处理被装饰函数的参数 (这个用的较多)
    
    """生成器原型
    定义一个decorator函数 
    """
    def deco(func): # func是被装饰的函数
        def _deco(a, b): # a, b是func的参数
            print "decorator do something"
            a += 1 
            ret = func(a, b)
            
            return ret
        
        return _deco # 再返回 <处理参数后的> <又包装一层的> 被装饰的函数 
    
    # 如上是decorator原型,多做了_deco函数 这部分代码的功能
    
    @deco    # decorator用在函数定义上, 用上以后,就被decorator装饰了, 多了deco函数中 _deco() 那部分功能了 
    def myfun(x, y):
        print "myfun", x, y
    
    if __name__ == "__main__":
        myfun(2, 3)
    """ result:
    decorator do something
    myfun 3 3
    """
  • 还有一种是decorator本身带有参数, 用的很少, 有时间再上代码


你可能感兴趣的:(Decorator,装饰器)