1ヶ月でWebデザイン・プログラミングスキルをオーダーメイドのカリキュラムで学べるスクール、それがWebCamp。

子供の想像力を伸ばしアイデアを形にする小学生向けプログラミング教室「プロスタキッズ」

Python超入門その23〜デコレーターで関数を修飾してみよう〜

Pocket

はじめに

複数の関数に共通の処理を持たせたいと思ったことはありませんか?

たとえば、ログ出力などが良い例でしょう。ログ出力は、機能横断的な要素であり、サブクラスなどで実装するのは適切ではありません。
とはいえ、ログ出力が必要な関数内でその都度ログ出力関数を呼び出すのもなかなかやっかいです。
そんなときのために、Pythonには「デコレーター」という仕組みが用意されています。

この記事では、Python初心者の方向けに、Pythonのデコレーターの書き方・使い方を説明していきます。
関数とクラス、2通りの書き方があるので、両方共覚えておきましょう。

デコレーターってなに?

デコレーターとは、いうなれば関数のラッパーです。

つまり、デコレートする対象の関数に新しい処理を付け加えることができるということです。
ひとつデコレーターを作れば、後は複数の関数に簡単にデコレーターを指定できるため、機能横断的な共通処理をまとめるために役立ちます。

言葉で説明していても理解しにくいので、さっそく実例をみてみましょう。

関数でのデコレーターの定義と使い方

まずは、関数としてデコレーターを定義する方法です。デコレーターといっても普通の関数定義です。

ただし、一定の処理を実装する必要があります。
次の例をみて下さい。

例:

 

すこし難しい実装なので、じっくりみていきましょう。

ここでは、デコレーターとしてlogger関数を定義しています。
引数として受け取るのは、デコレートする関数です。

つまり、関数を受け取る関数(高階関数)というわけですね。

さらに、関数内でネストした関数を定義しています。
ネストした関数は親の関数のローカルスコープにアクセスできることを思い出して下さい。

例では、logger関数の引数funcを利用しています。
__name__属性からは、関数名を取得できます。 wrapper関数は、可変長引数(引数をいくつでも受け取れる)になっており、それをそのままデコレートする関数の引数として渡しています。
そして最後に、wrapper関数を返しています。

このデコレーターを使うには、次のようにします。

例:

 

関数をデコレートするには、関数定義の前に”@(デコレーター名)”を指定します。
後は通常通り関数を呼び出すだけです。

すると、先程のデコレーターが呼び出され、関数呼び出しの前後に処理が追加されます。
魔法のようですが、これには次のようなからくりがあります。

例:

 

これは先程の例と等価です。
Pythonはこれを自動的に行なってくれます。

logger関数にデコレートする関数を渡すと、それをラップしたwrapper関数が返ってきます。
後はそれに通常通りの引数を渡すと、wrapper関数の内部で追加の処理とデコレートする関数が呼び出されるという寸法です。

次に、デコレーターをクラスで定義する方法をみてみましょう。

クラスでのデコレーターの定義と使い方

デコレーターは、クラスとしても定義することができます。

関数の場合とはやや異なり、次のように定義します。

例:

 

クラスでデコレーターを定義する場合には、__init__でデコレートする関数を受け取って自身の変数に保存しておきます。それから、デコレーターが呼び出されると__call__が実行されるので、先ほどのwrapper関数と同じように追加の処理とデコレートする関数を呼び出しれやればOKです。

ここでは、関数の実行時間を計測して出力しています。
デコレートする関数は、先程と同じように”@(デコレーター名)”を指定するだけです。

このように、デコレーターはさまざまな用途に活用できます。

まとめ

デコレーターの使い方がお分かりになりましたか?

デコレーターはログ出力だけでなく、関数の実行時間のチェックなど、さまざまな用途に使えます。
デコレーターは魔法ではなく、関数呼び出しをラップしているだけだということを忘れないで下さい。

アイディア次第で便利に使えますので、あなたオリジナルの使い道を考えてみて下さい。

あなたはデコレーターでどんなことをしますか?

投稿者:プロスタ編集部

  • このエントリーをはてなブックマークに追加
  • follow us in feedly

初心者がプログラミングで挫折しない学習方法を無料動画で公開中。オンラインに特化したプログラミングスクール「TechAcademy(テックアカデミー)」が解説。

この記事が気に入ったら
いいね!しよう

プロスタの最新情報をお届けします

あわせて読みたい

関連記事

ページ上部へ戻る