ホームページ >バックエンド開発 >Python チュートリアル >Python デコレータの原理と使用法の分析

Python デコレータの原理と使用法の分析

不言
不言オリジナル
2018-05-02 15:59:202361ブラウズ

この記事では、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()
実行結果:

test1 内
実行時間: 3.0001718997955322

---------- ----境界線----------------
test2 Tomwenxing 内

実行時間: 3.000171422958374

5. パラメーター付きのデコレーター

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。