Python入門 デコレータについて

lecture

デコレータは既存の関数を書き換えずに変更を加えることができます。
デコレータを理解するには、関数内関数を使ってみることです。

Pythonは関数の引数として関数を渡すことができます。
まずは関数内関数の実例を見てください。

ここでは単純な値を返す2つの関数を用意しています。
1つ目の関数は「イチゴ」を返し、もう1つの関数は引数をそのまま返すものです。
3つ目の関数は引数に関数をとるようにして、関数内に関数を持つことでクロージャの仕組みをうまく活用しています。

def strawberry():
  return 'イチゴ'

def free(word):
  return word

def cake(func):
  def wrapper(*args, **kwards):
    return func(*args, **kwards) + 'ケーキ'
  return wrapper

my_cake = cake(strawberry)
your_cake = cake(free)
print(my_cake())
print(your_cake('チョコレート'))

結果
イチゴケーキ
チョコレートケーキ

同じ内容のものをデコレータで記述するとすっきりと書けます。

def cake(func):
  def wrapper(*args, **kwards):
    return func(*args, **kwards) + 'ケーキ'
  return wrapper

@py
def strawberry():
  return 'イチゴ'

@py
def free(word):
  return word

print(strawberry())
print(free('チョコレート'))

結果
イチゴケーキ
チョコレートケーキ

スポンサーリンク

Flaskでの活用

デコレータの仕組みはFlaskのルーティングでもうまく活用されています。

@app.route('/')
def welcome():
    return 'Welcome!'

Flaskをインスタンス化しておいて、route()メソッドに対して自作したwelcome()関数をデコレートすることで、ルート割り当てに対して指定した表示内容を表示させることができています。

タイトルとURLをコピーしました