Python デコレータ

はじめに

みなさんこんにちはALEXです。今回はデコレータについて解説します。デコレータとはPythonの関数を修飾するための仕組みです。修飾するってどういうことだろう?とおみいますよね。ではいつものように実際にコードを書きながら理解しましょう。そんなに難しくありません。気軽に行きましょう。  

デコレータを作る

まず、Hello world!を出力する関数を定義して実行します。

以下のように表示されます。

 

では、この関数をデコレータで修飾してみましょう。以下のようなコードを書きます。

以下のように表示されます。  

 

def deco(func)という関数を定義します。このなかで定義するwrapperがhello_world()をデコレートするデコレータ関数を定義します。6行目でこのwrapperをオブジェクトとして返します。return wrapperがデコレートするためのデコレーターの定義関数です。

1行目のdef deco(func)ではデコレーター関数を定義します。引数をfuncしていますが、デコレートされる関数であるhello_world()が引数として渡されます。ここがポイントですのでしっかり覚えてください。

2行目で定義するdef wrapper()はデコレートの詳細を記述するための関数です。引数は※args, ※※kwargsとします。これは以前学んだ可変長位置引数、可変長キーワード引数ですね(くわしくはこちら)。ひとまずここはこのように記述することとしましょう。

4行目func(※args,※※kwargs)で、1行目で引数として渡された関数が実行されます。 3行目のprint(‘–before–‘)と6行目のprint(‘–after–‘)で、5行目の前後に実行する処理を記述します。 デコレーターを使えば、既存の関数の処理の前後に自処理を付け加えることができます。ライブラリとして提供されている関数を呼んだときに自動的に実行される処理を付加することができます。 この方法はかなり便利な方法です。

今後、ご説明する応用編の中でご紹介する。ウェブアプリの製作に必要なフレームワークのflaskでは、デコレータがバンバン出てきます。その他にも、オーバーライドでは関数自体を書きかえて使うけれど、関数の処理そのものは変えなくて、違った処理を同時にさせたい、というようなときにはデコレータを使う、という使い分けができると思います。  

まとめ

デコレータとはPythonの関数を修飾するための仕組みということを学びました。また具体例を一つ紹介しましたが、このほかにもデコレータは返り血を持つ関数でも使うことができたり、ネスとして使ったりと幅広い応用があります。その他にも、ジェネレータと組み合わせたりなどができ、とても幅広い使い方ができます。今後、学んでいきましょう。