この記事では、Python デコレータの原理と使い方を主に紹介し、Python デコレータの概念、原理、使用方法、関連する操作上の注意点をサンプルの形式で分析します。原則と使用例を示します。参考として、以下のように皆さんと共有してください:
1. デコレータの本質は
関数 で、主に他の関数を装飾するために使用されます。つまり、 他の関数に追加の関数を追加します 2. デコレータの原則:
(1) デコレータは、デコレータ関数のソースコードを変更できません
(2) デコレータは、デコレータ関数の呼び出しメソッドを変更できません
3. デコレータを実装するための知識の蓄え
(1. ) Python の関数は '変数'
a、そして Python の変数の保存
x='Tomwenxing' y=x
Python インタプリタはステートメント x='Tomwenxing' に遭遇すると、主に 2 つのタスクを完了します。
1. 文字列「Tomwenxing」を保存するためのメモリ空間を作成します。
2. メモリ内に x という名前の変数を作成し、それを使用して文字列「Tomwenxing」を指すようにします。 メモリ空間占有中 (部屋と部屋番号の関係として理解できます)
そしてステートメント y=x は、変数 x の文字列への参照を変数 y に代入することを意味します、メモリ内に変数 y を作成し、その変数が指すメモリ空間を指すようにします。 関数の保存は変数と似ています。上記の関数を例に挙げると、Python は主に次の 2 つのことを行うと説明します。 1. 関数コードの文字列を格納するためにメモリ内にメモリ空間を開きます (この例ではコードには 1 つの文しかありません: pass)
2. メモリ内に変数テストを作成して、関数コード文字列が格納されているメモリ空間を指します
(test='関数本体'に相当)
つまり、Pythonでは関数は変数です(2)関数(高階関数となるためには、次の2つの条件のいずれかが満たされます)
a. 関数名を実パラメータとして別の関数に渡します[デコレータへの影響]: 「追加」の効果を実現します。ソースコードを変更せずに装飾された関数に機能を追加しますdef test():
pass
バー内 関数の実行時間は: 2.0021145343780518
b 戻り値には関数名が含まれます
。
[デコレータへの影響]: 「関数の呼び出し方法を変更しない」効果が得られますimport time def bar(): time.sleep(2) print('in the bar') def test(func): start_time=time.time() func() stop_time=time.time() print('函数的运行时间为:',stop_time-start_time) test(bar)
(3) 入れ子関数:関数本体で def を使用して新しい関数を宣言します (呼び出しではありません)import time def bar(): time.sleep(3) print('in the bar') def test2(func): print('新添加的功能') return func bar=test2(bar) bar()ログイン後にコピー
実行結果:
foo 内
bar 内 4. デコレータの構文: 高階関数 + ネストされた関数=> デコレーター (次の例は、コードの実行順序を確認するために pycharm デバッガーでデバッグできます)def foo():
print('in the foo')
def bar(): #声明一个新的函数,而不是调用函数
print('in the bar')
bar()
foo()
実行時間: 3.00017189979553225. パラメーター付きのデコレーター---------- ----境界線----------------
実行時間: 3.000171422958374
test2 Tomwenxing 内
import time def timer(func): def deco(*args,**kwargs):#使用了不定参数 start_time=time.time() res=func(*args,**kwargs) #运行函数 stop_time=time.time() print('运行时间:',stop_time-start_time) return res # 若无返回值,则返回None return deco @timer #等价于test1=timer(test1)=deco,即test1()=deco() def test1(): time.sleep(3) print('in the test1') @timer #等价于test2=timer(test2)=deco,即test2(name)=deco(name) def test2(name): time.sleep(3) print('in the test2',name) test1() print('-------------分界线------------------------') test2('Tomwenxing')
ユーザー名:Tomwenxing--------------------------------境界線-------------------
インデックスページへようこそ
パスワード:123
ユーザー Tomwenxing は正常にログインしました。wenxing、ホームページへようこそ
関数の戻り値は次のとおりです: これはホームページです----------------------境界線---- -- -------------このログイン方法はまだサポートされていません。
関連する推奨事項:
Python デコレーターを使用して関数の実行時間を計算する
Python イテレーターの定義と簡単な使用法分析
以上がPython デコレータの原理と使用法の分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。