Python 3 – Pythonデコレータの紹介-Pythonチュートリアル

学ぶ Pythonデコレータ このチュートリアルでは。

デコレータを使用して既存の関数に機能を追加します。 これはメタプログラミングと呼ばれます。

関数は関数を引数として取ることができます(飾る機能)そして、拡張子の有無にかかわらず同じ関数を返します。

機能の拡張は非常に便利な場合があります。この記事の後半で実際の例を示します。

関連コース: 完全なPythonプログラミングコースと演習

関数はオブジェクトです

Pythonでは、関数を含むすべてがオブジェクトです。 これは、関数を渡して返すことができることを意味します。 あなたがそれを見るとき、それは最初は奇妙に見えるかもしれません:

1
2
3
4
5
6
7
8
def hello():                                                                                                
print("Hello")


message = hello


message()

message()またはhello()のいずれかのメソッドを呼び出すと、同じ出力になります。 これは、同じオブジェクトを参照しているためです。

それでは、デコレータを続けましょう。

デコレータ

デコレータは関数を受け取り、それを拡張して戻ります。 はい、 関数は関数を返すことができます

1
2
3
4
5
6
7
8
9
10
11
12
def hello(func):                                                                                            
def inner():
print("Hello ")
func()
return inner

def name():
print("Alice")


obj = hello(name)
obj()

上記の例では、hello()はデコレータです。

声明の中で

関数name()は、関数hello()によって装飾されています。

関数を他の関数でラップします。

Pythonデコレータ

例2

関数は、それらをラップすることによって拡張できます。

1
2
3
4
5
6
7
8
9
10
11
12
def who():                                                                                                  
print("Alice")

def display(func):
def inner():
print("The current user is : ", end="")
func()
return inner

if __name__ == "__main__":
myobj = display(who)
myobj()

関数who()はdisplay()によって装飾されます。

シンタックスシュガー

デコレータは一般的であり、簡略化できます。 まったく同じことをしますが、コードはよりクリーンです。

Pythonは、デコレータの使用を簡素化できます。 @記号

1
2
3
4
5
6
@hello                                                                                                      
def name():
print("Alice")

if __name__ == "__main__":
name()

これはまったく同じように出力されますが、コードを書くためのよりクリーンな方法です。

私と一緒にいて。 呼び出し

簡単な書き方です。

どちらの場合も、デコレータを関数に適用します。

引数

パラメータはデコレータで使用できます。 このように、合計a + bを出力する関数がある場合

1
2
3
def sumab(a,b):                                                                                             
summed = a + b
print(summed)

デコレータ関数でラップできます。
以下の例は、その方法を示しています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def pretty_sumab(func):                                                                                     
def inner(a,b):
print(str(a) + " + " + str(b) + " is ", end="")
return func(a,b)

return inner

@pretty_sumab
def sumab(a,b):
summed = a + b
print(summed)

if __name__ == "__main__":
sumab(5,3)

関数sumabは、関数pretty_sumabによってラップされます。 これは、その上に@記号で示されます。

関数sumabを呼び出し、関数sumabとpretty_sumabの両方のロジックがパラメーターを使用して実行されていることを確認します。

実世界の例

ユースケース:時間測定

デコレータの例

デコレータを使用して、関数の実行にかかる時間を測定できます。

スリープする単純な関数を定義すると、

1
2
def myFunction(n):                                                                                                        
time.sleep(n)

次に、行@measure_timeを追加するだけで、所要時間を測定できます。

以下の例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import time                                                                                                               

def measure_time(func):

def wrapper(*arg):
t = time.time()
res = func(*arg)
print("Function took " + str(time.time()-t) + " seconds to run")
return res

return wrapper

@measure_time
def myFunction(n):
time.sleep(n)

if __name__ == "__main__":
myFunction(2)

これにより、関数myFunction()の実行にかかった時間が出力されます。 すばらしいのは、1行のコードを追加することです。 @measure_time これで、プログラムの実行時間を測定できます。

Webアプリのデコレータ

ユースケース:Webアプリ
Webアプリのユースケースを見てみましょう。 FlaskでWebアプリを構築するときは、常にURLルートを記述します。

すべてのルートは、Webアプリの特定のページです。
ページ/ aboutを開くと、about_page()メソッドが呼び出される場合があります。

1
2
3
@app.route("/about")
def about_page():
return "Website about nachos"

この場合、装飾に@記号を使用します。

例と演習をダウンロードする

Hope this helps!

Source link