python関数の1つの装飾器


python関数の1つの装飾器
アクセラレータの構文は@で始まり、次にアクセラレータ関数の名前とオプションのパラメータです.続いて、装飾器は、修飾された関数と装飾関数のオプションパラメータを宣言します.次のように
@decorator(dec_opt_args)
def funcToBeDecorated(func_opt_args):
    .
    .

複数のアクセラレータの場合、数学的定義を使用して次のように表されます.
( g.f )(x) = g( f(x) )

Pythonの場合:
@g
@f
def foo():
    .
    .
g(f(foo))に等しい
単純関数装飾
#!/usr/bin/env python

from time import ctime,sleep

def deco(func):
    def wrappedFunc():
        print '[%s] %s called' % (ctime(),func.__name__)
        return func()

    return wrappedFunc


@deco
def foo():
    print 'foo called' 

if __name__=='__main__':
    foo()

######################################## 
localhost:~ army$ ./deco.py 
[Sun Apr 13 16:20:01 2014] foo called
foo called

パラメータ付き関数を修飾する
eg:
#!/usr/bin/env python

from time import ctime,sleep

def deco(func):
    def wrappedFunc(*argv):
        print '[%s] %s called' % (ctime(),func.__name__)
        return func(*argv)

    return wrappedFunc


@deco
def add(a,b):
    print a+b

if __name__=='__main__':
    add(1,2)
######################################## 
localhost:~ army$ ./deco.py 
[Sun Apr 13 16:25:01 2014] add called
3

装飾テープパラメータ
アクセサリーバンドパラメータは、包装を追加する必要があります
#!/usr/bin/env python

from time import ctime,sleep

def deco(arg):
    def wrappedFunc(func):
        def innerFunc(*argv):
            print '[%s] %s called' % (arg , func.__name__)
            return func(*argv)

        return innerFunc

    return wrappedFunc


@deco('module')
def foo(a,b,c):
    print a+b+c 

if __name__=='__main__':
    foo(1,2,3)    

######################################## 
localhost:~ army$ ./deco.py 
[module] foo called
6