[関連する学習の推奨事項: Python チュートリアル ]
# 不带参数的装饰器def deco_test(func): def wrapper(*args, **kwargs): print("before function") f = func(*args, **kwargs) print("after function") return f return wrapperdef do_something(a,b,c): print(a) time.sleep(1) print(b) time.sleep(1) print(c) return aif __name__ == '__main__': # 不用@ f = deco_test(do_something)("1","2","3")
なしのデコレーター 出力:
before function 1 2 3 after function
個人的な理解:
は、do_something
関数の外側に 2 つの出力 (before function
と after function
) を置くことと同じです。
# 不带参数的装饰器def deco_test(func): def wrapper(*args, **kwargs): print("before function") f = func(*args, **kwargs) print("after function") return f return wrapper @deco_testdef do_something(a,b,c): print(a) time.sleep(1) print(b) time.sleep(1) print(c) return aif __name__ == '__main__': # 使用@ f = do_something("1","2","3")
を使用して出力:
before function 1 2 3 after function
個人的な理解:
do_something
関数を実行する場合と同じです。@
の理由により、デコレータ deco_test
の層があることがすでにわかっているため、次のことを行う必要はありません。別途書いてください deco_test(do_something)
が消えてしまいました。
# 带参数的装饰器def logging(level): def wrapper(func): def inner_wrapper(*args, **kwargs): print("[{level}]: enter function {func}()".format(level=level, func=func.__name__)) f = func(*args, **kwargs) print("after function: [{level}]: enter function {func}()".format(level=level, func=func.__name__)) return f return inner_wrapper return wrapper @logging(level="debug")def do_something(a,b,c): print(a) time.sleep(1) print(b) time.sleep(1) print(c) return aif __name__ == '__main__': # 使用@ f = do_something("1","2","3")
出力:
[debug]: enter function do_something() 1 2 3 after function: [debug]: enter function do_something()
個人的な理解:
パラメータ付きデコレータレベル = "デバッグ"
。
最も外側の関数 logging()
はパラメータを受け取り、それらを内部のデコレータ関数に適用します。内部関数 wrapper()
は関数をパラメータとして受け取り、その関数にデコレータを配置します。ここで重要な点は、デコレータは logging()
に渡されるパラメータを使用できるということです。
# 类装饰器class deco_cls(object): def __init__(self, func): self._func = func def __call__(self, *args, **kwargs): print("class decorator before function") f = self._func(*args, **kwargs) print("class decorator after function") return f @deco_clsdef do_something(a,b,c): print(a) time.sleep(1) print(b) time.sleep(1) print(c) return aif __name__ == '__main__': # 使用@ f = do_something("1","2","3")
出力:
class decorator before function 1 2 3 class decorator after function
個人的な理解:
デコレータを使用してラップする関数の場合は、呼び出し可能なインスタンスを返します。したがって、クラスデコレータが定義されます。
# 不带参数的装饰器def deco_test(func): def wrapper(*args, **kwargs): print("before function") f = func(*args, **kwargs) print("after function") return f return wrapper# 带参数的装饰器def logging(level): def wrapper(func): def inner_wrapper(*args, **kwargs): print("[{level}]: enter function {func}()".format(level=level, func=func.__name__)) f = func(*args, **kwargs) print("after function: [{level}]: enter function {func}()".format(level=level, func=func.__name__)) return f return inner_wrapper return wrapper @logging(level="debug")@deco_testdef do_something(a,b,c): print(a) time.sleep(1) print(b) time.sleep(1) print(c) return aif __name__ == '__main__': # 使用@ f = do_something("1","2","3")
出力:
[debug]: enter function wrapper() before function 1 2 3 after function after function: [debug]: enter function wrapper()
個人的な理解:
関数内do_something()
まず、外側に deco_test()
デコレータの層を配置し、次に外側に logging()
デコレータの層を配置します。
プログラミング学習について詳しく知りたい方は、php training のコラムに注目してください!
以上がPython デコレータについて話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。