Pythonのコアプログラミング - デコレータ

二つの関数定義関数:

- * -コーディング:UTF-8 - * - 


DEFのfoo():  打印"fooの..." 
    印刷" FOO ... " 
    

デフバー():  打印"バー..." 
    印刷" バー... " 
    
    
のfoo()  fooの... 
バー()  バー...
コードの表示

実行時関数を計算し、我々は機能を書き換えることができます。

インポート時間   (文書)の上に


DEFのFOO():
    スタート = time.time()  関数の実行時の前に
    
    印刷FOO ... 
    time.sleep( 1)  プログラムは、あまりにも時間を実行しているので、短いので、1秒の時間を延長するtime.sleepの使用()
    
    終了 = time.time()  機能は、瞬間の後に実行される
    印刷(エンド-スタート)   #1 の時間プリントラン
    
    
DEFのバー():
    スタート = time.time()  実行時の関数の前に
    
    印刷バー... 
    time.sleep( 1)  時間を実行しているプログラムは短すぎるので、1S時間を延長するtime.sleepの使用()ので
    
    終了 = time.time()  機能は、瞬間の後に実行される
    印刷(エンド-スタート)   #1 の時間プリントラン
    
    
のfoo()
fooの.. 。1.0006506443023682 

バー() 
バー... 1.0007519721984863
コードの表示

関数内の各機能の時間を計算するためにいくつかのコードを追加することで、我々は我々の要求を達成することができるようになりますが、それは次の問題が登場しました。

  1、(関数への各呼び出しは実行時間を出力します、もしあれば、私はそれを印刷したくない?)関数自体の機能を変更します。

  2は、繰り返し大規模なコードの量、および(ここでは2つだけの特徴機能、我々は手動で数十人、数百人が存在する場合、それは私たちが一日の手のけいれんに変更しなければならないことを意味するであろう変更することができます)。

 

したがって、上記の2例について、およびコードの重複を解決し、機能自体を変更することはありません、我々は新しい定義することができる時間を計算する機能を

インポート時間


DEFのfoo():   印刷"fooの..." 
    印刷" FOO ... " 
    

DEFバー():  印刷"バー..." 
    印刷" バー... " 
    
    
DEF caltime(FUNC ):   #1 時間実行する関数を計算する 
    time.time =()を起動   前ランタイムする関数
    
    FUNC()を
    time.sleep( 1)。  時間を実行プログラムは短すぎるので、1S time.sleep()長期間の使用のため
    
    の端部 time.time =()  機能は、瞬間の後に実行される
    印刷 - (エンドスタート)
    
    
caltime(FOO) 
fooの... 1.0009233951568604 

caltime(バー)
#のバー... 1.0008749961853027
コードの表示

私たちは、新しい関数を作成することで機能を実現することを発見し、それは簡単で、便利です。しかし、関数が呼び出され、この方法は、のような変更されました:

私たちは、関数functionを呼び出すために始めている:FOO() 今、時間の関数を計算するために、我々は道を呼び出す:caltime(FOO)

私たちは、需要がある到達する必要があります:最終実行のfoo()で、達成することができます関数自体の機能計算を実行する関数の時間を代わりにcaltime(FOO)。

 

私たちは、呼び出し関数fooの数十に突出、および両方が時間を計算する必要がある場合は、私たちは一つ一つを配置する必要はありませんというのfoo()へのcaltime(FOO) 実際には、これは厄介なものです。だから我々は(それがまだのfoo()関数呼び出しを書かれているが、同時に実行するように計算することができます)方法のように:

インポート時の


デフのfoo():   打印"fooの..." 
    印刷" FOO ... " 
    

デフバー():  打印"バー..." 
    プリント" バー... " 


デフcaltime(FUNC ):
     DEF 内側():
        開始 = time.time()
    
        FUNC()
        time.sleep( 1 
    
        の端 = time.time()
         プリント(終了- 開始)
    
    戻り内側


FOO = caltime(FOO)を 
FOO() 
 fooの... 1.0006935596466064
コードの表示

最後に、我々は代わりにcaltime(FOO))(FOOによって機能を呼び出すことです。そこで、我々は渡すことができますよう、関数の戻り値を(関数を呼び出すときに表記)究極の呼び出しを達成するために、転送同じ。

caltime(FOO)実行結果は、内側機能(内部機能を実行しない)が返され、次いで内側関数fooへの割り当て(すなわち、FOO = caltime(FOO))。だから、fooが())(内部の実装に相当します。

Caltimeはこちら()であるデコレータが、我々は(各実行fooの前に見つかります)FOO = caltime(FOO)を書き込むだけでなく、非常に面倒、それはより多くのプロのデコレーターであるだろうよりエレガントな文言です。

  関数の前に書かれた1、デコレータcaltime()関数。

  2、FOO = caltime(FOO)文(リピート)コード書き込まれたライトへの各コール@caltimeのフロントパフォーマンス関数に方法を、。

インポート時間


デフcaltime(FUNC):
     DEF 内側():
        開始 = time.time()
    
        FUNC()
        time.sleep( 1 
    
        の端 = time.time()
         プリント(終了- 開始)
    
    を返す内部


@caltimeの   此时caltimeを就相当于是FOO = caltime(FOO)
デフのfoo():   打印"fooの..." 
    印刷" FOO ... " 
    

デフバー():  打印"バー..." 
    印刷" バー.. 。"


FOO = caltime(FOO)
のfoo()
fooの... 1.000216007232666
コードの表示

 

おすすめ

転載: www.cnblogs.com/tom-blogs/p/11202559.html