質問: python初心者です。 デコレーターがどういうものなのか、どういった時に必要となるのかが理解できません。 例とともに教えていただけたら幸いです。
回答: 例えば標準ライブラリに functools.lru_cache というデコレータがあります。 このデコレータは、たとえば自分で作成した関数が実行にある程度長い時間がかかる(1秒程度)けれども、関数の引数に対して返値がずっと変わらない、あるいは一定期間変わらない場合に使用します。 ``` def get_first_image(url): """与えられたURLのページを開いて、HTML内からリンクされている一番大きな画像データを返す""" # ここに実装 return image_data ``` こんな関数を実装した場合実行に2,3秒くらいかかるかもしれません。もしこの関数に同じURLを何度も指定する可能性があるなら、URLに対する結果をキャッシュしておけば2回目以降の実行は速く返せるはずです。 そこで、以下のように書きます。 ``` from functools import lru_cache @lru_cache() def get_first_image(url): """与えられたURLのページを開いて、HTML内からリンクされている一番大きな画像データを返す""" # ここに実装 return image_data ``` これでキャッシュされるようになりました。 decoratorを使えば関数の呼び出しに対して処理を付加できます。今回の例では、get_first_imageという関数にキャッシュ機能を付加しました。デコレータは、対象関数の呼び出しに対する結果を変えないのが原則です。デコレータを使えば関数の返値を書き換えたりもできてしまいますが、利用者はそのようは副作用があると混乱するので、やらないほうがよいでしょう。