高度なデコレータ
1、デコレータ機能を使用しますが、関数呼び出し関数名やコメントにも__name通じ__、__ doc__内の例題ビュー
functools インポートラップ DEFの:ラッパー(FUNC) #FUNC =ホリデー @wraps(FUNC) DEFインナー(* argsを、** kwargsから): 印刷(' 飾られている機能が何を実行する前に' ) RET = FUNC(* argsが、** kwargsからは) 印刷(「飾られている関数の後に行う実行」) のリターンRETの 復帰インナー @wrapper #休日がラッパー(ホリデー)= DEF ホリデー(日): 「」「これは休日の予告です'」 「 印刷(「すべての休日%sの日」%の日) リターン 「楽しい」 印刷(休日。__name__)#のプリントアウト呼び出し元の関数の関数名 を印刷(休日。__doc__)#のプリントアウト注釈機能は、関数と呼ばれる #の結果: #の休日 #これは休日のお知らせです
#functoolsインポートラップから DEFの:ラッパー(FUNC) #1 FUNC =ホリデー #@wraps(FUNC) DEFインナー(* argsを、** kwargsからの): 印刷(' 関数は装飾やって実行される前に' ) RET = FUNC (* argsを、** kwargsから) 印刷(「関数実行を行う添え後」) のリターンRETの 復帰インナー @wrapper #休日がラッパー(ホリデー)= DEF ホリデー(日): 「」 ' これは休日のお知らせです「」「 印刷(」終日休日%sの「%日) のリターン 」楽しい" 印刷(休日。__name__)#のプリントアウト機能の名前は、関数呼び出し、 印刷(休日。__doc__)#のコメント機能呼び出し機能プリントアウト #最初の行をし、削除コードの3行、結果 #インナー #1 なし
パラメータデコレータと2、
あなたには、いくつかの時間のためのデコレータ機能を使用する必要があるが、この時間の後、それは時間を持っていない場合は、パラメータ化デコレータを使用することができます
インポート時 FLAGE = Falseの デフtimmer_out(フラグ): デフtimmer(FUNC): DEF、内側(* argsを、** kwargsから): あればフラグ: 開始 = time.time() RET = FUNC(* argsを、** kwargsから) 終了 = time.time() プリント(エンド開始) を返すRET 他: RET = FUNC(* argsを、** kwargsから) リターンRET 戻り内側 リターンtimmer #timmer = timmer_out(FLAGE) @timmer_out(FLAGE) #ワッハッハー= timmer(ワッハッハー) DEF :ワッハッハー() time.sleep( 0.1 ) プリント(' wahahahahahaha ' ) @timmer_out(FLAGE)を DEF erguotou(): time.sleep( 0.1 ) プリント(' erguotoutoutou ' ) ワッハッハー() erguotou()
図3に示すように、装飾的な機能デコレータの複数
デフWRAPPER1(FUNC): デフinner1(): プリント(' WRAPPER1、FUNC前' ) RET = FUNC() 印刷(' WRAPPER1、FUNC後' ) のリターンRETの 復帰inner1 デフwrapper2(FUNC): デフinner2(): 印刷(' wrapper2、FUNC前' ) RET = FUNC() プリント(' wrapper2、FUNC後') リターンRETの 復帰inner2 デフwrapper3(FUNC): デフinner3(): プリント(' wrapper3、FUNC前' ) RET = FUNC() 印刷(' wrapper3、FUNC後' ) のリターンRETの 復帰inner3 @ wrapper3 @ wrapper2 @ WRAPPER1 デフF(): 印刷(' Fにおける' ) の戻り ' 哈哈哈' 印刷(f())