まず、デコレータ:
基本的に、機能を機能:他の機能への追加機能を追加します
原則:
1.装飾的な機能は、ソースコードに変更を加えることができます
2.機能が変更と呼ばれて変更することはできません。
シンプルなデコレータ
インポート時の デフtimmer(FUNC): デフラッパー(* argsを、** kwargsから): START_TIME = time.time() RES = FUNC(* argsを、** kwargsから) STOP_TIME = time.time() 印刷( '函数运行的时间%s'は%(STOP_TIME - START_TIME)) リターンRES リターンラッパー @timmer DEF CAL(L): RES = 0 I Lにするため: time.sleep(0.01) RES + = iの 戻りRES RET = CAL(範囲(200 )) プリント(RET)
第二に、デコレータのナレッジベース
高階関数デコレータ= + +ネストされた閉鎖機能
高階関数の定義:
1.機能受信したパラメータは、関数名があります
2.関数の戻り値は、関数名です
3.満たす上、高次機能のいずれかの条件を呼び出すことができます
高階関数とアナログデコレータ:
結果は複数回実行します
時間インポート DEF fooの(): (3)time.sleep 印刷( 'FOOから') DEF Timmer(FUNC): START_TIME time.time =() FUNC() time.time =()STOP_TIME 印刷(「実行時間関数を)、 - Sは%「%(START_TIME STOP_TIME)である リターンFUNCの FOO = Timmer(FOO) )(FOO
第三に、ネストされた関数とクロージャ
ネスティングは、機能の再定義された関数であります
閉鎖:クロージング-----> -----変数のパケットにカプセル化>機能層
各パッケージ変数は、それ自体が、探して見つけた後、外側の層から見つけることができないようになったその層を探し始めます
キー:変数である機能
DEF父(名前): DEF息子(): 印刷(%名'私の父は%Sである') DEFの孫(): 名= '中国の 印刷( '私の祖父%S' %名) 孫() 息子() の父( '河南省')
装飾的なフレーム
Timmer DEF(FUNC): DEFラッパー(): #追加機能 FUNC() の戻りラッパー
デコレータサプリメントの棚
時間インポート DEF Timmer(FUNC): DEFのwarpper(): #増加機能 =()START_TIME time.time FUNC() time.time =()STOP_TIME -印刷(START_TIME) 'を実行する時間だったS%' %(STOP_TIME) リターンラッパー DEFテスト(): time.sleep(2) プリント( 'テスト機能の実行が終了される') RES = Timmer(テスト)#は、ラッパーのアドレスを返す (RES)を#ラッパーが実行されます()
試験:受信された値の関数にコードの最後の2行の関数限り、見ることができるように
すなわち:
テスト= timmer(試験) 試験()
の原則に沿って、デコレーターの外観
しかし、それぞれの時間は、明らかに不合理であるテスト= timmer(テスト)を書き換えるための機能に機能を追加する必要がありました
したがって、@timmerテスト= timmer(テスト)で置き換えます
時間インポート DEF Timmer(FUNC): DEFのwarpper(): #増加機能 =()START_TIME time.time FUNC() time.time =()STOP_TIME -印刷(START_TIME) 'を実行する時間だったS%' %(STOP_TIME) リターンwarpper @timmer#当量= Timmerテスト(試験) DEFテスト(): time.sleep(2) プリント( 'テスト機能の実行が終了される') テスト()
四、プラスデコレータの戻り値
時間インポート DEF Timmer(FUNC): DEFのwarpper(): #増加機能 START_TIME time.time =() RES = FUNC()#関数のテストは非常に機能するためにここに戻り値を変数を受け取るために、ここで実行 STOP_TIME =時間.time() 印刷( '実行時だったS%' %(STOP_TIME - START_TIME)) を返すここRES#戻り値が返さテストするために リターンをwarpper @timmer#換算:= Timmerテスト(テスト) DEFテスト(): time.sleepは、(2) プリント(「機能テストの実行が完了」) リターン「これは、戻り値のテストである」 A =テスト() プリント(A)
第五に、パラメータのデコレータを追加
時間インポート DEF Timmer(FUNC): DEFラッパー(* argsを、** kwargsから):#は任意の値を受け入れ #増加関数 START_TIMEをtime.time =() RES = FUNC(* argsを、** kwargsから)#ラッパーを受け入れます値渡さそのままFUNCの STOP_TIME time.time =() 印刷(%(STOP_TIME 'を実行時間S%だった' - START_TIME)) RESを返す リターンをwarpper @timmer#換算:= Timmerテスト(テスト) DEF test1に(名前は、年齢、ガンダー): time.sleep(2) 印刷( '名前にtest1の動作結果%D sの%%sの年齢性別' %(名前、年齢、ガンダー)) リターン'戻り値test1のは' = TEST1( '金陵'、20 '女性'である) 印刷(A) @timmer :DEF TEST2(名前、年齢) time.sleep(3) プリント(%(名前、年齢) '関数のTEST2結果は%sの年齢Dの%という名前') 'このTEST2の戻り値である'リターン B = TEST2( 'liuwen'、18れる) プリント(B)
第六に、検証デコレータを実装します
func_ver DEF(FUNC): DEFラッパー(* argsを、** kwargsから): NAME1 INPUT =( 'ユーザー名を入力してください:') 、PD = INPUT( 'あなたのパスワードを入力してください:') NAME1 == 'PJL' IFとPD == '123': FUNC(* argsを、** kwargsから) 他: 印刷( 'ユーザー名またはパスワードが間違っている') 戻りラッパー @func_ver DEFインデックス(): 印刷( '私のサイトへようこそ') @func_ver ホームDEF(名): 印刷( '%Sウェルカムホーム' %名) @func_ver :DEF Secrect(名) を印刷( '%Sこれはあなたの小さな秘密である' %名) インデックス() ホーム( '金陵') secrect( '済寧')