pythonの閉パッケージと装飾器


閉パッケージの定義:
関数を定義し、関数の内部に内部関数を定義し、この関数が外部関数の変数を使用すると、内部関数と使用される変数を閉パッケージと呼びます.
閉パッケージの定義例:
#         
def decorator(func):
    #               
    def inner():
        print("      ")
        #               
        func()
   #                ,     
    return inner

主な役割:
閉パケットはコードの多重性を向上させるが,外部関数を用いた変数により関数が実行後に変数が解放されないため,閉パケットは変数を保存する機能を有し,閉パケットは軽量クラスといえるがメモリの消費も増加する.
装飾器の定義:pythonの文法糖"@"と閉包を利用して既存の関数の機能拡張を実現する.アクセサリーの機能:
  • 導入ログ
  • 関数実行時間統計
  • 関数前予備処理
  • を実行する.
  • 関数実行後クリーンアップ機能
  • 権限チェック等シーン
  • キャッシュ
  • 1.0パラメータなし戻り値なしの関数装飾
    def decorator(func):
       def inner():
           print("         ...")
           func()
       return inner
    
    @decorator
    def func():
       print("              ...")
    
    func()
    

    2.0パラメータなし戻り値のある関数装飾
    def decorator(func):
        def inner():
            print("         ...")
            return func()
        return inner
    
    @decorator
    def func():
        print("              ...")
        return "   :",True
    
    
    print(func())
    

    3.0パラメータ付き戻り値なしの関数装飾
    def decorator(func):
        def inner(num):
            print("         ...")
            func(num)
        return inner
    
    @decorator
    def func(num):
        print("              ...")
        print("   :", num)
    
    
    func(10)
    

    4.0パラメータ付き戻り値付き関数装飾
    def decorator(func):
        def inner(num):
            print("         ...")
            return func(num)
        return inner
    
    @decorator
    def func(num):
        print("              ...")
        return "   :", num
    
    
    print(func(10))
    

    5.0パラメータ付き装飾品(装飾品工場)
    #                ,          
    def outer(params):
        def decorator(func):
            def inner(num):
               if params is True:
                 print("         ...")
                 return func(num)
             return inner
        return decorator
    
    @outer(True)
    def func(num):
        print("              ...")
        return "   :", num
    
    print(func(10))
    

    6.0万能装飾器:*argsと*kwargsを追加して余分なパラメータを受信する
    def decorator(func):
        def inner(num, *args, **kwargs):
            print("         ...")
            func(num, *args, **kwargs)
        return inner
    
    @decorator
    def func(num, *args, **kwargs):
        print("              ...")
        print("      :", num)
        print( "      :", args, kwargs)
    
    
    func(10, 20, a=10, b=20)
    

    7.0類装飾器
    class decorator(object):
        # init               
        def __init__(self, func):
            self.__func = func
            print("          ...")
        #           ,    __call__  ,                      
        def __call__(self, *args, **kwargs):
            self.__func()
    
    @decorator
    def func():
        print("          ...")
    
    func()