pythonノート24_デコレーション


主な内容:
  • 小目標:デコレーション
  • を理解する
  • 主な内容:装飾器基本文法、装飾器応用
  • この文章を読み終わったら、装飾器がまだ分かりません.あなたは私を探しに来て、私はあなたを打たないことを保証して、私はあなたに100のお年玉をあげます.
    1.ケース
    1.1需要:2つの関数
    mySum:計算リストの和、パラメータはリストmyMax:統計リストの最大値、パラメータはリストでなければなりません
    コード実装:
    def mySum(args):
        #  args     
        if isinstance(args, list):
            return sum(args)
        return -1
    
    def myMax(args):
        #  args     
        if isinstance(args, list):
            return max(args)
        return -1
    print(mySum([1,2,3]))
    print(mySum((1,2,3)))
    print(myMax(123))

    結果:6,-1,-1
    1.2新規需要:パラメータはタプルを使用可能
    コードの変更:
    def mySum(args):
        #  args     
        if isinstance(args, (list, tuple)):
            return sum(args)
        return -1
    
    def myMax(args):
        #  args     
        if isinstance(args, (list, tuple)):
            return max(args)
        return -1
    print(mySum([1,2,3]))
    print(mySum((1,2,3)))
    print(myMax(123))

    結果:6,6,-1
    1.3質問:
  • 他のデータ構造を追加したらどうしますか?
  • このような関数がN個ある場合はどう処理しますか?

  • 前の修正から分かるように,条件を判断する際に同じで,唯一の異なる処理方式である.
    2.閉パッケージの適用
    上を分析し、解決方法:
    各関数のコア機能は異なりますが、判断条件は同じで同じ部分を関数に分割し、閉パケット処理を使用します.
    def decoFunc(func):
        #checkArgs     ,func  checkArgs     
        def checkArgs(args):
            #      
            if isinstance(args, (list, tuple)):
                return func(args)
            return -1
        return checkArgs
    
    #    sun  
    mySum = decoFunc(sum)
    #   max  
    myMax = decoFunc(max)
    print(mySum([1,2,3]))
    print(mySum((1,2,3)))
    print(myMax(123))

    結果:6,6,-1
  • 分析:
    decoFunc(func)のfuncはcheckArgsに対して外部変数decoFuncの戻り値はcheckArgs関数mysum,myMaxはcheckArgs関数を指すが,各関数内部のfuncは異なるmysum,myMaxが呼び出した後argsをチェックし,異なるfuncを用いてarsを処理してもよいだろう.

  • 3.装飾器
    どのように装飾器を整理するか:
    装飾:関数を変更し、新しい関数を返します.装飾器は閉包原理と似ているが、関数を処理するためにのみ使用される.
    基本構文:
    @deco
    def func(args):
        pass

    例をみると
    def decoFunc(func):
        #checkArgs     ,func  checkArgs     
        def checkArgs(args):
            #      
            if isinstance(args, (list, tuple)):
                return func(args)
            return -1
        print('checkArgs:', checkArgs)
        return checkArgs
    
    @decoFunc
    def mySum(args):
        return sum(args)
    print('mySum:', mySum)

    結果:
    checkArgs: .checkArgs at 0x000001C4A21580D8>
    mySum: .checkArgs at 0x000001C4A21580D8>

    分析:
    mySum変数名はdecoFuncの戻り値を指します:checkArgs関数br/>@decoFuncはデザイナの構文糖です結果からmySum関数は呼び出されていませんが、デザイナ関数はデフォルトで実行されます
    装飾実質:2つの例を比較すると、装飾実質:mySum=decoFunc(mySum)
    3.パラメータ付きの装飾器
    新しい要件:checkArgsパラメータを変更しないでmySumを呼び出し、myMaxの前に対応する関数名を印刷します.
    直接コード:
    def decoFunc(fname):
        print("call decoFunc")
        # _decoFunc      ,  _decoFunc
        def _decoFunc(func):
            #checkArgs     ,func  checkArgs     
            def checkArgs(args):
                #      
                if isinstance(args, (list, tuple)):
                    print("call func:", fname)
                    return func(args)
                return -1
            print('checkArgs:', checkArgs)
            return checkArgs
        return _decoFunc
    
    @decoFunc('mySum')
    def mySum(args):
        return sum(args)
    print('mySum:', mySum)
    mySum([1,2,3,4,5])

    結果:
    call decoFunc
    checkArgs: ._decoFunc..checkArgs at 0x000001C4A1D00B88>
    mySum: ._decoFunc..checkArgs at 0x000001C4A1D00B88>
    call func: mySum

    解析かいせき:関数に関係を含めるかんすにかんけいを含める:decoFunc->decoFunc->checkArgs@decoFunc('mySum')プロシージャを実行します.
    1.decoFunc('mySum')を実行し、fnameを設定し、_を返します.decoFuncbr/>2.実行@decoFunc('mySum')実質@戻り_decoFunc,3>mysum = _decoFunc(mySum)
    皆さんは装飾器を見て、特にパラメータ付きの装飾器を見て、めまいを感じて、私たちがしなければならないのは、一歩一歩分析して、原理を明らかにすることです.以上が装飾に関する内容です.
    まとめ:
  • 装飾器を理解するには、まず閉包を理解しなければならない.
  • 閉パケットを理解するには、役割ドメインと関数の戻り値を明らかにしなければならない.
  • 装飾器は実際に動作し、特にサードパーティフレームが適用される場合(Djano、Scrapyなど)、応用は非常に広範である