関数デコレータの知人

例えば:1チャールズ・リーは、タスクの手配を担当して、xxの技術有限公司で働く、
機能の憎悪憎悪を書くために弟の効率をテストするためのコードを記述します。
インポート時(1つのモジュール)
DEFインデックス():
time.sleep(2)
印刷(「ブログホームパークへようこそ」)

計算効率の操作機能
プリント(time.time())
START_TIME time.timeは=()
のインデックス()
END_TIME = time.time()
プリント(F 'この関数{END_TIME-START_TIME}の効率')

  1. Directorは鄧小平、李象、あまりにも多くの重複したコードをテストすることができます。
    func1のDEF():
    time.sleep(2)
    印刷( 'ウェルカムホーム日記')

関数func2のDEF():
time.sleep(1)
印刷( 'ホームを見直しへようこそ')

= time.timeのSTART_TIME()
関数func1()
END_TIME = time.time()
プリント(F 'は、この関数の効率{END_TIME-START_TIME}')

= time.timeのSTART_TIME()
関数func2()
END_TIME = time.time()
プリント(F 'は、この関数の効率{END_TIME-START_TIME}')

  1. 機能に統合
    :DEFの関数func1()
    time.sleep(2)
    印刷( 'ウェルカムホーム日記')

関数func2のDEF():
time.sleep(1)
印刷( 'ホームを見直しへようこそ')

test_time DEF(X):
START_TIME time.time =()
X()
)(= time.timeをEND_TIME
( 'この関数の効率はEND_TIME-START_TIME} {' F)印刷
test_time(関数func1)
test_time(関数func2)

  1. この関数は、実際のプロジェクトで実行される500コロンビアを嫌い嫌い、マスターが尋ねた:この機能を実行するとき、それは機能の効率をテストするために同時に実行されます。
    インデックスDEF():
    time.sleep(2)
    'ブログホームパークへようこそ')を印刷
    インデックス()

test_time DEF(X):
time.time =()START_TIME
X()
END_TIME = time.time()
プリント(F 'は、この関数の効率{END_TIME-START_TIMEを}')

test_time(インデックス)

問題の4バージョン:満足開放性の原則は、原則を閉じて:オリジナル機能、および呼び出しのソースコードを変更しないでください。閉鎖の原則の違反:機能の変更が呼び出されます。

バージョン5:あなたは、元の関数(クロージャ)を呼び出す方法を変更することはできません:
DEFインデックス():
time.sleep(2)
印刷(「ブログホームパークへようこそ」)
インデックス()

func1のDEF():
time.sleep(2)
印刷( 'ウェルカムホーム日記')

test_time DEF(X):X =指数
DEFインナー():
START_TIME time.time =()
X()
)(= time.timeをEND_TIME
( 'この関数の効率はEND_TIME-START_TIME} {' F)印刷
リターンインナー
インデックスtest_time =(インデックス)
インデックス()

@デコレータシンタックスシュガー・プラス・ファンクション名
DEF F():
印刷(666)
F = '白'
印刷(F)

test_time DEF(X):X =指数
DEFインナー():
START_TIME time.time =()
X()
time.time =()END_TIME
( 'この関数の効率END_TIME-START_TIME} {' F)印刷
リターンインナー

インデックス= test_time @test_time(インデックス)
DEFインデックス():
time.sleep(2)
'ブログホームパークへようこそ')を印刷
指数= test_time(インデックス)
インデックス()

func1のDEF():
time.sleep(2)
印刷( 'ウェルカムホーム日記')

@test_timeの
DEFの関数func2():
time.sleep(1)
印刷( 'ホームを見直しへようこそ')

関数func2 = test_time(関数func2)
FUNC3 = test_time(FUNC3)
関数func2()

バージョン6:装飾された関数の復帰
DEFのtest_time(X):X =指数
DEFインナー():
time.time =()START_TIME
RET = X()
(:RET {}「F'ret)プリント
END_TIME =時間。時間()
印刷(F 'この関数END_TIME-START_TIME} {効率')
リターンRETの
復帰インナー

インデックス= test_time @test_time(インデックス)
DEFインデックス():
time.sleep(0.5)
'ブログホームパークへようこそ')を印刷
Trueを返し

印刷(インデックス())、内側( )
あなたは真のインデックス()ように、それは完璧ですが、あなたは完全に元の関数の使用を変更しないので、もし今指数は、内部であるに戻って確認する必要がありますが、印刷する(インデックス()) - - >真

バージョン7:かどうかをプラスデコレータずに、「Taibaijinxing」のあなたの引数はパラメータnに渡される装飾的な関数パラメータ、、。6達成することができないが、バージョンパラメータ渡し、インデックス(「Taibaijinxing」)==内(「Taibaijinxing」)

test_time DEF(X):X =指数
DEFインナー(引数、kwargsから):
定義された関数:*
重合。
引数=( 'りんご')
(1 ,. 3)のargs =は
time.time =()START_TIME
RET = X(
引数、kwargsから)
:*の機能を実行
休憩を。
X = RET( 'リンゴ'))== X( 'リンゴ')
RET = X(
(1 ,. 3))== X(1,3)
プリント(F'ret:RET {}「)
END_TIME = time.time()
'この関数の効率END_TIME-START_TIME} {' F)印刷
リターンRETの
復帰インナー

インデックス= test_time @test_time(インデックス)
DEF指数(N-):
time.sleep(0.5)
を印刷(F '{n}はアクセスホームパークをブログにようこそ')
Trueを返し

@test_timeインデックス= test_time(インデックス)
デフ関数func2(A、B):
time.sleep(0.5)
プリント(F '最终结果:{A + B})
+ bを返します

印刷(インデックス( 'りんご'))、内側( 'りんご')
印刷(func2を(1,3))==インナー(1,3)

warpper DEF(F):
DEFインナー(* argsを、** kwargsから):
'装飾機能の前に作動させる' '' ''
印刷(666)
RET = F(* argsを、** kwargsからは)
機能を装飾するために」 ''操作「」「の後に
印刷(」完成「)
リターンRETの
復帰インナー

@warpper
:DEF FUNC()
印刷(111)
FUNC()
FUNC()
FUNC()
FUNC()
FUNC()
アプリケーションデコレータ:元と呼び出しに本来の機能を変更することなく、その追加機能。
ログイン認証、印刷ログ。

おすすめ

転載: www.cnblogs.com/-777/p/11076846.html