Python.use(better) 《余録》デコレーター #2:関数の装飾

記事一覧 Python.use(better)《Python3.1》

デコレーター #2:関数の装飾

《著》森こねこ、小粒ちゃん+∞《監修》小泉ひよ子とタマゴ倶楽部
第0版♪2001/03/02 ● 第1版♪2003/05/25 ● 第2版♪2004/06/01 ● 第3版♪2009/02/28

例題によって「基本構文」の理解を深めます。
※ Python2.4 で作成した例題を、Python3.1 で再構成しました。

■ 事例2:

次に示すコードの断片

    def happy(arg):    #1a:
        print("Are you happy:", arg)

    happy("?")
    print("-"*40)
    print(happy)       #1b:
    print("="*40)

    def piyo(arg):     #2a:
        print("I am piyo:", arg)
        return yes

    def yes(arg):
        print("Yes, as happy as happy can be:", arg)

    @piyo
    def happy(arg):    #3a:
        print("I am happy:", arg)

    print("-"*40)
    print(happy)       #2b:
    happy("!")         #3b:

を実行すると、次のような出力結果

Are you happy: ?
                                                                              • -
======================================== I am piyo:
                                                                              • -
Yes, as happy as happy can be: !

が得られます。

■ 解説

デコレーターに呼応する関数のリターン値に、別の関数を指定します。デコレーター構文

@piyo

を評価すると、関数 piyo を呼び出します。すると、次のような出力結果

I am piyo: 

が得られます。デコレーター @piyo で関数 happy を修飾すると、次に示す

happy = piyo(happy)    #5:

と、同じ効果が得られます。つまり、関数 piyo の実引数に、関数オブジェクト happy を指定したのと同じです。そのため、

  • (#2a)引数 arg を介して、関数オブジェクト happy を参照するので、
I am piyo(): 

という出力結果が得られます。しかも、関数オブジェクト yes をリターン値に指定したので、

  • (#2b)組み込み関数 print の引数に happy を指定すると、

このように、関数オブジェクトに関する情報が出力されます。さらに、

  • 関数呼び出し happy("!") によって、
Yes, as happy as happy can be: !

このように、文字列が出力されます。なぜなら、関数を定義したときの名前と同じ

  • (#5)変数 happy は、リターン値である、関数オブジェクト yes を参照する

からです。もはや、変数 happy は、関数 yes の別名にすぎません。

》こちらに移動中です《
TOP


関連記事

セミナー課題の中から、他の書籍でも紹介されている内容は、
受講者ではなくても閲覧できるように、ここに公開します。

Python 3 プログラミング徹底入門

Python 3 プログラミング徹底入門

  • 作者: マーク・サマーフィールド,Mark Summerfield,長尾高弘
  • 出版社/メーカー: ピアソン桐原
  • 発売日: 2009/12/01
  • メディア: 単行本
  • 購入: 1人 クリック: 61回
  • この商品を含むブログ (21件) を見る
8.1.5 でも「デコレーター」を話題にしているので、比較するのも一興です。
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

Last updated♪2010/01/27