pythonのデコレータの詳細な理解

  • デコレータ

    デコレータは、別の関数を受け取り、明示的に変更せずに後者の関数の動作を拡張する関数です。

  • 機能

    関数は、指定された引数に基づいて値を返します。

  • ファーストクラスのオブジェクト

    Pythonでは、関数はファーストクラスのオブジェクトです。

    これは、他のオブジェクト(sting、int、float、listなど)と同じように、関数を渡して引数として使用できることを意味します。

  • 内部機能

    内部関数は、他の関数の内部で定義された関数です。

  • 関数から関数を返す

    Pythonでは、関数を戻り値として使用することもできます。

    括弧なしのreturn関数。これは、返された関数への参照を返すことを意味します。

  • シンプルなデコレータ

    def my_decorator(func):
        def wrapper():
            print("Something is happening before the function is called.")
            func()
            print("Something is happening after the function is called.")
        return wrapper
    
    def say_whee():
        print("Whee!")
    
    say_whee = my_decorator(say_whee)
    

    デコレータは関数をラップし、その動作を変更します。

  • シンタックスシュガー

    上記のフォーマットは少し不格好です。

    Pythonでは@、「パイ」構文と呼ばれることもあるシンボルを使用して、より簡単な方法でデコレータを使用できます。

    次の例は、最初のデコレータの例とまったく同じことを行います。

    def my_decorator(func):
        def wrapper():
            print("Something is happening before the function is called.")
            func()
            print("Something is happening after the function is called.")
        return wrapper
    
    @my_decorator
    def say_whee():
        print('Whee!')
    
  • デコレータの再利用

    デコレータは単なる通常のPython関数です。

    他のファイルにインポートすることができます。

    def do_twice(func):
        def wrapper_do_twice(*args, **kwargs):  # 输入参数
            func(*args, **kwargs)
            return func(*args, **kwargs)   # return values
        return wrapper_do_twice 
    

    内省による情報の保持について:

    import functools
    
    def do_twice(func):
        @functools.wraps(func)   # 
        def wrapper_do_twice(*args, **kwargs):
            func(*args, **kwargs)
            return func(*args, **kwargs)
        return wrapper_do_twice
    
  • ファンシーデコレータ

  • クラスを飾る

    Pythonでインを内蔵しているデコレータがあり@classmethod@staticmethod@property

    デコレータは、クラスinsdieメソッドを定義するために使用されています。@classmethod@staticmethod

    @propertyデコレータは、クラス属性のgetterとsetterをカスタマイズするために使用されます。

  • LiaoXuefengから

    デコレータは本質的に、関数を返す高次の関数です。

  • 参考文献

  1. Pythonデコレータの入門書
  2. PEP 318 –関数とメソッドのデコレータ
  3. Python wiki:デコレータ
  4. LiaoXuefengの公式ウェブサイト

おすすめ

転載: blog.csdn.net/The_Time_Runner/article/details/109171356