TIL(9) - Decorator


Decorator学習
Pythonでdecoratorが演じた役を探ってみましょう.
装飾器とは何ですか.
  • バックグラウンド:Pythonでは、オブジェクトが変数に格納されたアドレスに呼び出されます.したがって、関数オブジェクトを含む変数(アドレス)をパラメータとして他の関数に渡して呼び出すことができる.
  • 定義
  • :上記の原理に従って、関数をパラメータ値として受け入れ、コマンドを追加し、関数の形式の関数として返します.関数の内部修正を必要とせずに機能を変更するために使用され、通常は関数の前後の修飾を追加する必要がある場合に使用されます.同時に、レコーダを使用して、メソッドや関数の重複と拡張の責任を軽減します.
  • の下で、異なる装飾器の使い方を見て、それらがどのように働いているかを見てみましょう.
  • <関数オブジェクトの性質を示すコード>
    def func():
        return 1
    
    print(func())
    print(func)
    
  • 上の2つの印刷出力文の違い:カッコの違いの有無;上は関数を実行し、下は関数の位置を実行します.
  • 従って、print(func()出力戻り値は1であり、print(func)出力<関数func at 0 x 7 fc 830001 df 70>である.
  • は、前述の関数がオブジェクト特性を有することを示す.
  • <関数構造のコード>
    
    def hello(name='Ray Kim'):
        print('The hello() function has been executed')
    
        def greet():
            return '\t This is the greet() func inside hello'
        def welcome():
            return '\t This is welcome() inside hello'
    
        if name == 'Ray Kim':
            return greet
        else:
            return welcome
            
     my_new_func = hello('Ray Kim')
     
  • hello()関数の内部に存在するgreet()およびwelcome()関数は、hello()内でのみ呼び出される範囲が限られた関数である.関数の範囲が固定されているため、通常の関数のようにhello()関数を呼び出すとエラーが発生します.
  • ビットエラーに対して、関数を関数のパラメータ値とする方法がある.上記のコード例のように、「my new func=hello」のhello関数のパラメータ値は「Ray Kim」 上のコードのif節を受け入れるからです.hello()関数は1回目、greet()関数は2回目です.hello関数の呼び出しgreet関数の方法の一つ.関数の内部に存在する関数を呼び出すときに使用する方法.
  • <親関数の関数コードを無視>
    def cool():
    
        def super_cool():
            return ' I am very cool!'
    
        return super_cool
    
    some_func = cool()
    some_func #cool()
  • some func変数をcool()関数として積分したが,coolは伝達された親関数にすぎず,特別な役割はないため,その内部のsuper cool関数を返す.
  • <同じ線上で定義された別の関数Bをパラメータ値として使用するコード>
     
    def hey():  
        return 'Hey Ray!'
    
    def other(some_def_func):
        print('Other code runs here!')
        print(some_def_func())
    
    print(id(hey))
    print(id(other))
    hey() 
    other(hey) 
  • 以上のコード出力結果:
    "Other code runs here!"
    "Hey Ray!"
  • =>上記のコードは、関数Aが別の関数Bのパラメータ値に入り、関数Bのコマンドを実行し、自分の内部でコードを実行する方法を示しています.
    =>上記の出力プロセスについて詳しく説明します...aaa
    (1)「other(hey)」を実行すると、まず定義したhey()関数がother()関数のパラメータ値に入ります.
    (2)other()関数の最初の内部コマンド「other code runs here!」出力後、
    (3)パラメータ値を2番目の内部コマンドprint(some def func()関数)に入れ、print(hey()に変換する関数を実行し、「heyray!」出力します.
    <前後折り返し(wrap)機能関数+@decorator機能のコード>
    
    def new_decorator(original_func):
    
        def wrap_func():
    
    
            print('Some extra code, before the original function')
    
            original_func()
    
            print('some extra code, after the original function!')
    
        return wrap_func
    
    def func_needs_decorator1():
        print("I want to be decorated!")
    
    func_needs_decorator1()
    
    decorated_func = new_decorator(func_needs_decorator1)
    decorated_func()
    
    
    @new_decorator 
    def func_needs_decorator2():
        print("I want to be decorated!")
    
    func_needs_decorator2()
    

  • a.wrap関数の概念説明:上記のコード例では「wrap func()」関数を使用しており、出力内容は必要な出力内容を前後に包むのと似ています.
    ["Some extra code, before the original function!"
    "I want to be decorated!"
    "some extra code, after the original function!"]
    =>new decorator()関数のパラメータ値は、パッケージ関数の内部内容である関数func decorator 1()を関数func decorator 1()に入れた後、パッケージ関数出力文(「someextracode…以下省略」と略す)を前後に出力します.
  • b.@decorator概念説明:
    -既存の作成した関数に新しい機能を追加する場合は、1)既存の関数にコードを追加する方法、2)既存の関数と同じコードを持つ新しい関数を作成する方法、および既存の関数に新しいコードを記述する方法に分けられます.メモリの使用、またはコード量管理において、大きな困難が発生する可能性があります.
    -では、前者の方法でどのように仕事を簡素化しますか?考慮事項として、既存の関数に新しいコードを記述した場合、これらの追加機能を後で削除したい場合は、これは課題です.これらを一つ一つ手で拭くのは不便です.そのため、スイッチを入れたり閉めたりして、新しい関数の機能を追加したり、削除したりする方法のように、実現されていません.これが今紹介している@Decoratorです.
    -上記のコードの例に示すように、def開始行の前の行に@some decoratorを書き込み、行を書き、行を削除し、目的の機能を挿入して削除できます.例)@decoratorが存在しない場合、上記のwrap func機能を実行すると再び失われます.
    -特にこの「@」機能はインターネット上で書かれたコードに基づいて応用されているが,これは必須であるため,ドラムやプラズマネットワークの開発によく用いられる.したがって、複数のコードを表示する場合は、その@オペレータの機能をよく理解し、どのように利用するかを理解する必要があります.