pythonノート24_デコレーション
4059 ワード
主な内容:小目標:デコレーション を理解する主な内容:装飾器基本文法、装飾器応用 この文章を読み終わったら、装飾器がまだ分かりません.あなたは私を探しに来て、私はあなたを打たないことを保証して、私はあなたに100のお年玉をあげます.
1.ケース
1.1需要:2つの関数
mySum:計算リストの和、パラメータはリストmyMax:統計リストの最大値、パラメータはリストでなければなりません
コード実装:
結果:6,-1,-1
1.2新規需要:パラメータはタプルを使用可能
コードの変更:
結果:6,6,-1
1.3質問:他のデータ構造を追加したらどうしますか? このような関数がN個ある場合はどう処理しますか?
前の修正から分かるように,条件を判断する際に同じで,唯一の異なる処理方式である.
2.閉パッケージの適用
上を分析し、解決方法:
各関数のコア機能は異なりますが、判断条件は同じで同じ部分を関数に分割し、閉パケット処理を使用します.
結果:6,6,-1分析:
decoFunc(func)のfuncはcheckArgsに対して外部変数decoFuncの戻り値はcheckArgs関数mysum,myMaxはcheckArgs関数を指すが,各関数内部のfuncは異なるmysum,myMaxが呼び出した後argsをチェックし,異なるfuncを用いてarsを処理してもよいだろう.
3.装飾器
どのように装飾器を整理するか:
装飾:関数を変更し、新しい関数を返します.装飾器は閉包原理と似ているが、関数を処理するためにのみ使用される.
基本構文:
例をみると
結果:
分析:
mySum変数名はdecoFuncの戻り値を指します:checkArgs関数br/>@decoFuncはデザイナの構文糖です結果からmySum関数は呼び出されていませんが、デザイナ関数はデフォルトで実行されます
装飾実質:2つの例を比較すると、装飾実質:mySum=decoFunc(mySum)
3.パラメータ付きの装飾器
新しい要件:checkArgsパラメータを変更しないでmySumを呼び出し、myMaxの前に対応する関数名を印刷します.
直接コード:
結果:
解析かいせき:関数に関係を含めるかんすにかんけいを含める:decoFunc->decoFunc->checkArgs@decoFunc('mySum')プロシージャを実行します.
1.decoFunc('mySum')を実行し、fnameを設定し、_を返します.decoFuncbr/>2.実行@decoFunc('mySum')実質@戻り_decoFunc,3>mysum = _decoFunc(mySum)
皆さんは装飾器を見て、特にパラメータ付きの装飾器を見て、めまいを感じて、私たちがしなければならないのは、一歩一歩分析して、原理を明らかにすることです.以上が装飾に関する内容です.
まとめ:装飾器を理解するには、まず閉包を理解しなければならない. 閉パケットを理解するには、役割ドメインと関数の戻り値を明らかにしなければならない. 装飾器は実際に動作し、特にサードパーティフレームが適用される場合(Djano、Scrapyなど)、応用は非常に広範である
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質問:
前の修正から分かるように,条件を判断する際に同じで,唯一の異なる処理方式である.
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)
皆さんは装飾器を見て、特にパラメータ付きの装飾器を見て、めまいを感じて、私たちがしなければならないのは、一歩一歩分析して、原理を明らかにすることです.以上が装飾に関する内容です.
まとめ: