Python装飾器decorator

2143 ワード

私のPython装飾器に対する理解は、一つの関数で別の関数を修飾することです.
アクセラレータは、元の機能を実行した上で、権限の検証、ログの印刷など、新しい機能を追加します.元のコードを修正せずに機能の拡張を行う
1関数式には、次のような関数があります.
def fun():
    print('I am fun')

fun()の実行結果は
I am fun

しかしfunを実行した結果は


したがって、関数の後に括弧を付けると関数の内部で実行され、括弧をつけないのは関数オブジェクトを表すだけである(Pythonの内部はすべてオブジェクトである).
2シーンには関数が山積みになっています
def fun1():
    print("I am fun1")

  def fun2():
    print("I am fun2")

  def fun3():
    print("I am fun3")

これらの関数が私が書いたことを証明するために、すべての関数の後ろに一言印刷します.
def fun1():
    print("I am fun1")
    print("author is wang")

しかし、関数にこの言葉を加えるのは面倒なようです.このとき尅は閉パッケージを用いて実現することを考える.
3閉パッケージの実現を閉パッケージの実現形式に変更する:
def shoe_author(func):
    def wrapper():
        print "The author is wang!"
        func()
    return wrapper

#   
def func1():
    print "running func1"

func1 = show_me(func1)

if __name__ == '__main__':
    func1()


プログラムがfunc 1=show_に実行されるとauthor(func 1)では直ちに関数を実行せず、新しい関数を定義しただけです.show_me(func 1)は、以下のように等価である.
def wrapper():
    print "The Author is wang"
    func1()

したがって、func 1()の場合にのみ、実際に実行されます.
4装飾器でPythonを簡略化@の文法糖を提供
 @show_author
  def fun1():
    print("I am fun1")

プログラムに示すように@shoe_authorと元の閉パッケージ実装fun 1=show_author(func 1)は完全に等価であり,元の関数を変更することなく装飾を追加し,機能を増加させることができる.
パラメータ付き装飾器この時点でこのプログラムを書いた著者を検証する必要がある場合は、パラメータ付き装飾器を使用することができます.
def Author(key):
    def func_wrapper(func):
        def decorator():
            if key == 'wang':
                print('The author is wang')
            print('I am fun Before')
            res = func()
            print('I am fun After')
            return res
        return decorator
    return func_wrapper

@Author(key = 'wang')
def fun():
    print('  ')
fun()


私たちはkeyの位置にプログラムを書く人の名前を加えることができます.これによりパラメータ付きの装飾器を実現した.