データレコーダ


Pythonのデコレーションの作成と使い方を整理します.
装飾師
パラメータとして関数を受け入れる関数!

デコレーション

  • ソース関数を変更せずに前後に新しい論理を追加する新しい関数を作成する
  • 関数もオブジェクトなので、関数オブジェクトのアドレスをパラメータとして他の関数に渡すことができます.戻りも関数
    ex)
    import time
    
    
    def make_time_checker(func):
          def new_func(*args, **kwargs):
                start_time = time.perf_counter()
                result = func(*args, **kwargs)
                end_time = time.perf_counter()
                print('실행시간:', end_time - start_time)
                return result
          return new_func
    
    @make_time_checker
    def big_number(n):
          return n ** n ** n
    
    @make_time_checker
    def big_number2(n):
          return (n+1) ** (n+1) ** (n+1)
    実行時間をチェックする関数をレコーダなしと書く場合は、実行するたびに同じタスクをすべての関数の先頭と末尾に配置する必要がありますが、レコーダを使用すると操作を簡略化できます.
  • レコーダ関数で既存の関数をパラメータとして受け入れる
  • レコーダ関数で新しい関数を定義-->既存の関数を変更せずに新機能を作成できる
  • 回車可能新関数
  • @decoratorレコーダを使用できます.

  • 上の画像の左側の方法もレコーダを使用する別の方法です.
    最後に、クラスとして作成し、アクセサリーを使用することもできます.
    import datetime
    
    
    
    class DatetimeDecorator:
    
            def __init__(self, f):
                    self.func = f
    
            def __call__(self, *args, **kwargs):
                    print datetime.datetime.now()
                    self.func(*args, **kwargs)
                    print datetime.datetime.now()
    
    class MainClass:
    
            @DatetimeDecorator
            def main_function_1():
                    print "MAIN FUNCTION 1 START"
    
            @DatetimeDecorator
            def main_function_2():
                    print "MAIN FUNCTION 2 START"
    
            @DatetimeDecorator
            def main_function_3():
                    print "MAIN FUNCTION 3 START"
    
    
    
    
    
    my = MainClass()
    my.main_function_1()
    my.main_function_2()
    my.main_function_3()

    リファレンス


    https://wikidocs.net/23106
    https://dojang.io/mod/page/view.php?id=2427
    https://bluese05.tistory.com/30