zoukankan      html  css  js  c++  java
  • python 18 函数基础二

    转自 http://www.cnblogs.com/BeginMan/p/3173328.html

    一、装饰器(decorators)

    装饰器的语法以@开头,接着是装饰器函数的名字、可选参数。

    紧跟装饰器声明的是被装饰的函数和被装饰的函数的可选参数,如下:

    @decorator(dec_opt_args)
    def func(func_args):
       ....

    其实总体说起来,装饰器其实也就是一个函数,一个用来包装函数的函数,装饰器在函数声明完成的时候被调用,调用之后声明的函数被换成一个被装饰器装饰过后的函数。

    如:

    复制代码
    def deco(func):
       ...
       return func
    
    @deco
    def foo():
          print 'foo'
    #-----------------------------------
    #等价如下:
    def deco(func):
       ...
       return func
    
    def foo():
          print 'foo'
    
    foo = deco(foo)
    复制代码

    如下例子:

    复制代码
    def deco1(func):
        print 'ok'
        return func
    
    @deco1
    def foo():
        print 'foo'
    foo()
    #输出--------------
    #ok
    #foo
    #------------------
    复制代码

    如果不使用装饰器,则可如下:

    复制代码
    def deco1(func):
        print 'ok'
        return func
    
    def foo():
        print 'foo'
    
    print foo           #<function foo at 0x00AFE6F0>
    foo = deco1(foo)    
    foo()
    #输出--------------
    #ok
    #foo
    #------------------
    复制代码

    两者对比下,可发现使用装饰器是那么简便、灵活。特别是在企业级的开发上。

    同时也可以多个装饰器重叠使用:

    复制代码
    def deco1(func):
        print 'deco1'
        return func
    
    def deco2(func):
        print 'deco2'
        return func    
    @deco1
    @deco2
    def foo():
        print 'foo'
    
    foo()
    
    #输出如下:-----------
    #deco2
    #deco1
    #foo
    #---------------------
    复制代码

    等效于:

    @deco1
    @deco2
    def foo(arg):pass
    -----------与下等效----------
    foo = deco1(deco2(foo()))

    二、有参、无参的装饰器

    上面的例子基本上都是有参数的,无参数更为简单。

    1、无参

    复制代码
    @deco1
    @deco2
    def foo(arg):pass
    ---------------------
    foo = deco1(deco2(foo()))
        
    复制代码

    2、有参

    @deco1(deco_arg)
    @deco2
    def foo(arg):pass
    ---------------------
    foo = deco1(deco_arg)(deco2(foo()))

    返回以函数作为参数的装饰器

    三、用处

    1、引用日志

    2、增加计时逻辑来检测性能

    3、给函数加入事务的能力

    四、实例

    复制代码
    from time import ctime,sleep
    
    def deco(func):
        def decoIn():
            print '[%s]:%s called' %(ctime(),func.__name__)
            return func
        return decoIn
    
    @deco
    def foo():
        pass
    
    foo()
    sleep(4)
    
    for i in range(2):
        sleep(1)
        foo()
        
    #输出如下:--------
    #[Fri Jul 05 10:45:04 2013]:foo called
    #[Fri Jul 05 10:45:09 2013]:foo called
    #[Fri Jul 05 10:45:10 2013]:foo called
    #------------------
    复制代码

    五、强烈推荐阅读:

    http://www.cnblogs.com/huxi/archive/2011/03/01/1967600.html

  • 相关阅读:
    Java异常处理设计(三)
    TS 3.1
    TS 3.1
    Other
    样式
    Other
    Other
    TS 3.1
    TS 3.1
    TS 3.1
  • 原文地址:https://www.cnblogs.com/cmybky/p/11772383.html
Copyright © 2011-2022 走看看