【Python】デコレータとは?|サックリかんたん解説

初心者向けサックリかんたん解説

ここでは一通りPythonを勉強した私が「ここはわかりづらいだろうな」と思った点や、最近Pythonの勉強をし始めたという初心者の方がつまづきがちな点をピックアップし、長ったらしくならないようできるだけ簡単にサクッと解説していきます。

デコレータ (decorator) とは

デコレータとは

入力として関数を受け取り、別の関数を返す関数。既存の関数を書き換えずに既存の関数に変更を加えた関数を作ることができる。

デコレータは、関数を受け取って関数をデコレート(decorate: 飾る、飾り付ける)して返します
なので言い方を変えるとデコレータは、「関数を受け取って関数をデコレートして返す関数」です。

割と簡単ですよね、ではデコレータのかなり簡単な例を見てみましょう。

まず、次のような足し算を行う関数(add)があったとします。


1: def add(x, y):
2:     return x + y

これはかなり単純な関数ですね、引数としてx, yという数を受け取り、x + y した値を戻り値として返します。
しかし、このままではちょっぴり機能性に欠けます。

それでは、この関数を引き算もできる関数にして、なおかつprint関数を使って結果が見やすくなるようにデコレートしましょう。


1: def decorator(func):  # デコレータ関数 (func: デコレートしたい関数)
2:     def new_function(*args, **kwargs):
3:         print("足し算結果:", func(*args, **kwargs))
4:         print("引き算結果:", args[0] - args[1])  # ars[0], args[1]は add関数におけるx, yに対応
5:     return new_function   # デコレートされた関数を返す
6: 
7: @decorator  # @以降に"デコレータ"の名前を記述
8: def add(x, y):  # デコレートしたい関数を記述
9:     return x + y
10: 
11: add(10, 5)

デコレータは冒頭で言ったように、「関数を受け取って関数をデコレートして返す関数」です。
そのため、関数内関数の構造が出来ていることが上のコードから確認できます。

そして、デコレータの記述の仕方として、デコレートしたい関数の前の行に “@デコレータ名” という形で記述します。

これを実行してみるとこのような結果が得られます。


足し算結果: 15
引き算結果: 5

しっかりと元のadd関数をデコレートすることができましたね。

複数のデコレータを用いたい場合

ちなみに、一つの関数に複数のデコレータを用いたい場合は次のように記述します。

そして、複数のデコレータを用いる場合、デコレートする関数のすぐ上のデコレータから順に適用されていきます。

そのため、次の例では、@decorator_first, @decorator_second の順でadd関数がデコレートされていきます。


:  @decorator_second  # 二番目に実行されるデコレータ
:  @decorator_first   # 最初に実行されるデコレータ
:  def add(x, y):
:      # 以下省略

デコレートする順番によって適用結果が変わってくるようなシーンでは順番を意識して記述するようにしましょう。

デコレータは何がありがたいのか

ここまでデコレータの例を見てきましたが、「これ何に使うの?」という疑問を持った方も多いと思います。
「関数をデコレートせずに本元を普通に書き換えたらいいじゃん。」と思った方もいるかもしれません。

しかし、例えば複数人で大規模なコードを書いているときを想定してみてください。
そこでは、同僚のプログラマーが先に便利で大型の関数を記述していたとします。

その関数を勝手に書き換えるわけにはいかないという場合にこのデコレータが役に立ちます。
デコレータは既存の関数のソースコードを書き換えません。そのため、同僚が記述したコードをそのままにした状態で、それに追加機能を加えデコレートした関数が手に入ります。

あとは、よくある例は、デバック文の追加などです。
自分が書いた関数の中身を書き換えずに中身がどういった内容になっているかを確認することができます。

終わりに

ここまで見てくださりありがとうございました!

デコレータのことを知らずしてPythonの知識あります!なんてことは言えません。
理解してみるととても単純な内容なのでしっかりと習得しておきましょう。

※こちらの解説は「入門Python3」という本を参考にしました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です