デコレータは既存の関数を書き換えずに変更を加えることができます。
デコレータを理解するには、関数内関数を使ってみることです。
Pythonは関数の引数として関数を渡すことができます。
まずは関数内関数の実例を見てください。
def cake(func): def wrapper(topping='イチゴ'): return func(topping) + 'ケーキ' return wrapper def my_topping(favorite): print('私の好きなケーキは',end='') return favorite your_cake = cake(my_topping) print(your_cake()) print(your_cake('チョコレート'))
結果
私の好きなケーキはイチゴケーキ
私の好きなケーキはチョコレートケーキ
同じ内容のものをデコレータで記述するとすっきりと書けます。
def cake(func): def wrapper(topping='イチゴ'): return func(topping) + 'ケーキ' return wrapper @cake def my_topping(favorite): print('私の好きなケーキは',end='') return favorite print(my_topping()) print(my_topping('チョコレート'))
結果
私の好きなケーキはイチゴケーキ
私の好きなケーキはチョコレートケーキ
Flaskでの活用
デコレータの仕組みはFlaskのルーティングでもうまく活用されています。
@app.route('/') def welcome(): return 'Welcome!'
Flaskをインスタンス化しておいて、route()メソッドに対して自作したwelcome()関数をデコレートすることで、ルート割り当てに対して指定した表示内容を表示させることができています。