« Go言語のgoroutine間の同期(4) | トップページ | Redmineで開発管理しよう!(2) »

Pythonのデコレータ構文

Pythonにはデコレータ構文というものがある。
これは、クラス、関数、メソッドをデコレートする構文だ。

今、
def foo():
    print "Foo"

という関数があるとする。
この関数を実行すると、

Foo

と表示する。
さて、

  • 関数を実行する前
  • 関数を実行した後
  • 関数の実行する前と後

に、必ず何か処理をさせたいのだが、その関数自体を修正したくはない、というのはよくあることだ。
こんな時に、デコレータ構文が役にたつ。

今、関数fooの前に事前処理(preprocess)をさせたい場合には、次のように書く。

def Pre(f):
    def _():
        print "Pre Process"
        f()
    return _

@Pre
def foo():
    print "Foo"

関数fooを実行すると、

Pre Process
Foo

と表示される。
同様に、関数fooの後に、事後処理(postprocess)を実行させたい場合には、次のように書く。

def Post(f):
    def _():
        f()
        print "Post Process"
    return _

@Post
def foo():
    print "Foo"

また、関数fooを事前処理と事後処理ではさみたい場合には、次のように書く。

def PreAndPost(f):
    def _():
        print "Pre Process"
        f()
        print "Post Process"
    return _

@PreAndPost
def foo():
    print "Foo"

このようにデコレータは、既存の関数やメソッドに修正を加えずに、ログ機能を織り込みたい場合などに効果的に使える機能だ。

★WOZ★

にほんブログ村 IT技術ブログ 開発言語へ
にほんブログ村

|

« Go言語のgoroutine間の同期(4) | トップページ | Redmineで開発管理しよう!(2) »

Python」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1286769/32635793

この記事へのトラックバック一覧です: Pythonのデコレータ構文:

« Go言語のgoroutine間の同期(4) | トップページ | Redmineで開発管理しよう!(2) »