パラメータを持つデコレーター
デコレータは、あなたがデコレータを有効にするかどうかを判断するためのパラメータが必要な場合は、有効にするかどうかを決定するためのパラメータを渡す必要があり、使用しています。
現在、関数の内部で使用される外部関数、関数パラメータへの引数としてデコレータ、伝達関数名は達成できないパラメータを渡す、と呼ばれています。
したがって、必要である、渡されたパラメータを達成するために、ネストされたレイヤーを追加するために最大3つのデコレータ!!!
インポート時 から functoolsのインポートがラップ FLAGを = 真 DEF out_warpper(フラグ): デフwarpper(F): @wraps(f)は デフw_in(): もし:旗 プリント(" これはワープです!" ) RET = F() 他: RET = F() リターンRETの 復帰はw_in 戻りwarpper #out_warpper = out_warpper(FLAG)→out_warpper = warpper #関数func1 = warpper(関数func1)→関数func1 = w_in @out_warpper(FLAG) #の関数func1の DEFの関数func1(): time.sleep( 1 ) プリント(" これは関数func1ある" )
@out_warpper (FLAG) DEF 関数func2(): time.sleep( 1 ) プリント(" これは関数func2である" ) 関数func1() 関数func2()
@記号の後に実行されたときに3つの第1行、即ちout_warpper = out_warpper(FLAG)、変数フラグを保存することができる= warpper、閉鎖機能を、out_warpper返します。
@関数名で、関数func1 = warpper(関数func1)、それにより、送信パラメータのデコレータを達成する、関数func1 = w_inを返します。
装飾的な機能デコレータの複数
デフwarper1(F): DEF 、内側(): プリント(" inner1を行う始める!" ) 、F() 印刷を(" 後inner1行く!" ) を返すインナー デフwarper2に(F): DEF 、内側(): 印刷(" やる始まります!inner2 " ) F() 印刷(" ゴーinner2後に!" ) を返すインナー デフ(F)warper3を: DEF 、内側(): プリント(" inner3ん始まる!" ) 、F() 印刷を(" 後inner3行く!" ) を返すインナー @ warper3 @ warper2 @ warper1 デフFUNC(): 印刷(" これはFUNCです" ) FUNCを()
、最も外側の装飾から、機能を実行する関数の前にデコレータ装飾機能には、複数の最も内側→→最内層から始めて、出て行って行なわ