- 2018-12-1
- pythonプログラミング, 関数
- python, デコレーター
- 【Python入門】デコレーターの使い方についてわかりやすく解説 はコメントを受け付けていません
この記事では
Pythonで登場することがある、
デコレーターの使い方についてわかりやすく解説します。
【Python】デコレーターとは?
デコレーションケーキってありますね。
デコレートには飾るとか装飾するという意味があります。
デコレーターとは、目的とする関数に対して
何らかの処理を付け加えることをいいます。
とりあえず1つデコレーターを作っておけば
1つだけじゃなくて、複数の関数に使いまわすことができるんです。
そういった意味では、そり少ないコードで
アプリなどの開発ができるので
デコレーターは絶対に知っておいてほしい内容となります。
デコレーターの使い方
たとえば、例題1のような処理を作ったとしましょう。
#例題1 def add_suuji(x, y): return x + y print('これから計算を開始します。') print('計算が終了しました。') z = add_suuji(12, 21) print(z)
実行すると
これから計算を開始します。 計算が終了しました。 33
と出力されます。
で、33という数字の前後にある
『これから計算を開始します。』
や、『計算が終了しました。』という表示を
毎回計算のたびに表示させたい場合に
デコレーターを使うんです。
実際にやってみましょう。
例題2をご覧ください。
#例題2 def add_fo(func): def wrapper(*args, **kwargs): print('これから計算を開始します。') result = func(*args, **kwargs) print('計算が終了しました。') return result return wrapper def add_suuji(x, y): return x + y f = add_fo(add_suuji) z = f(12, 21) print(z)
例題2を実行すると例題1と同様に
これから計算を開始します。 計算が終了しました。 33
と出力されます。
では例題2について解説していきましょう。
まず
def add_fo(func):
ですが、
これはデコレーターのファンクションを書いています。
funcは引数です。
「引数って何?」という方、
詳しくはこちらで解説しています。
⇒【Python】関数を定義する方法・呼び出しや引数についても解説
次に
def wrapper(*args, **kwargs):
ですが、これは関数内関数です。
詳しくはこちらをご覧ください。
⇒【Python入門】関数内関数の利用法
それから、
*args, **kwargs
は引数をなんでも取れるように記述しています。
それから少し飛んで、
result = func(*args, **kwargs)
ですが、関数内関数の中で一番上にある、、、
def add_fo(func):
のfuncを実行する記述です。
でfuncの中で呼び出されたときに使う
*args, **kwargsを入れておきます。
そして
return result
このresultを返す記述です。
それから
return wrapper
このwrapperの関数内関数を最後に返してやるのですが
ここでは実行しません。
で、上記の前後に
def wrapper(*args, **kwargs): print('これから計算を開始します。') result = func(*args, **kwargs) print('計算が終了しました。') return result
こうやってprint文を入れて
目的とする文章を毎回表示させるようにしています。
これでデコレーターが完成しました。
あとは例題1のような結果を出力させるために、
def add_suuji(x, y): return x + y
は例題1と同じですね。
次に
f = add_fo(add_suuji)
fというファンクションの変数を宣言します。
それから実行するときには
z = f(12, 21) print(z)
fに12と21をいれ、zに代入し、
print文でzを表示させれば完了です。
実行すると
これから計算を開始します。 計算が終了しました。 33
と例題1と同じ結果が出力されます。
ただ、ちょっと複雑なデコレーターだったかもしれません。
そこでもう少しわかりやすくデコレーターを記述する方法について
解説していきます。
わかりやすいデコレーターの書き方
もっとわかりやすい記述にするなら『@』を使いましょう。
例題3をご覧ください。
#例題3 def add_fo(func): def wrapper(*args, **kwargs): print('これから計算を開始します。') result = func(*args, **kwargs) print('計算が終了しました。') return result return wrapper @add_fo def add_suuji(x, y): return x + y z = add_suuji(12, 21) print(z)
例題3を実行すると
これから計算を開始します。 計算が終了しました。 33
と例題1と同じ結果が出力されます。
使い方は
return wrapper @add_fo def add_suuji(x, y): return x + y
とreturn wrapperの次に
@をつけて、@add_foと記述するだけです。
簡単ですね。
こんな感じで@(アットマーク)をつけて
関数を指定してやればOKです。
以上でデコレーターの使い方についての解説を終わります。
pythonを学ぶならこちらの動画講座がおすすめです
Python 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイルを学び、実践的なアプリ開発の準備をする
かなり長い講座名ですね。
わかりにくそうな感じがします。ですが、pythonの基礎からしっかりとわかりやすく教えてくれます。
また、きれいなコードを書くための方法についても
教えてくれるので、周りが「どうやってそんなコードを書いてるの?」
とびっくりされるようになるかもしれません。それからWebアプリケーション開発の基本的なテクニックについても
教えてくれます。なので、pythonを使ってwebアプリケーションを作ってみようと
思っている方にもおすすめです。値段は時期によって違います。
詳しくはこちらをご覧ください。
みんなのAI講座 ゼロからPythonで学ぶ人工知能と機械学習
この講座ではまずpythonの基礎を学びます。
次に人工知能について学んでいきます。そして最終的にはpythonを使って文字認識や株価分析ができるような技術力が身につくようになっています。
単純に教科書的なpythonを学ぶのではなく
仕事でも使えるスキルを身につけたい方におすすめの講座です。なのに値段は恐ろしいほど安いです。
時期によって値段は変動するので
詳しくはこちらをご覧ください。
Pythonで機械学習:scikit-learnで学ぶ識別入門
この動画講座は広島大学准教授の先生が担当しています。
機械学習が専門の先生です。すごく深い知識が身につきます。
大学の先生の講義って難しそうってイメージがあるかもしれません。でもそんなことはありません。
すごくわかりやすいです。pythonで機械学習のスキルを身につけたい方におすすめです。
値段は時期によって違いますが、かなり、良心的な価格になっています。詳しくはこちらをご覧ください。