特集PC技術

Pythonを学ぼう

 

第26回 デコレーター


1.デコレーターとは

デコレーターとは、関数を修飾して、新しい関数を作成します。
つまり、関数に付加機能をつけることができます。
複数の関数に対して、同等の付加機能をつけたい場合に有効となります。

2.デコレーターの基本

デコレーターの基本文法は次のように書きます。

@デコレーター名(引数)

修飾したい関数の前に上記の文法を記述すると、その関数を修飾できます。
基本的に、デコレーターを使用する場合は、デコレーター関数内で、関数を定義して使用します。
次のプログラムを見てください。

# coding: utf-8

# デコレーター関数定義
def deco(f):
    def in_deco():
        print('before')
        f()
    return in_deco

# デコレーターを指定
@deco
def func():
    print('decorate')

# 関数funcを実行
func()

実行結果

before
decorate

デコレーターにより、deco関数の処理前に、'before'を出力しています。
このように、func関数そのものには、修正を加えずに、機能を追加できるところが、デコレーターの利点です。

3.デコレーターの引数

デコレーターに引数を使用することができます。
次のプログラムを見てください。

# coding: utf-8

# デコレーター関数定義
def deco(value):
    def deco1(f1):
        def deco2(*args, **kwds):
            return value
        return deco2
    return deco1

# 引数付きでデコレーターを指定
@deco(False)
def func():
    return True

# 関数funcを実行
print(func())

実行結果

False

deco関数は引数で与えたものを返す機能となっています。
そのため、func関数を実行すると、引数Falseが戻り値になります。

4.デコレーターのネスト

デコレーターはネストすることができます。
ネストする場合、デコレーターを複数指定します。
次のプログラムを見てください。

# coding: utf-8

# デコレーター関数定義
def deco(f):
    def deco1(*args, **kwds):
        result = f(*args, **kwds)
        return result * 2
    return deco1

# ネストしてデコレーターを指定
@deco
@deco
def func():
    return 3

# 関数funcを実行→(3 * 2) * 2 = 12
print(func())

実行結果

12

@decoを2回指定してネストしています。
deco関数は、修飾する関数の戻り値に2を掛ける関数です。
そのため、func関数を実行すると、まずは、3 * 2を計算します。
その計算結果に対してさらに2を掛けるので、(3 * 2) * 2となり、実行結果は12になります。

5.Javaとの比較

Javaには、デコレーターがないため、
この回では、Javaのソースコードとの比較はありません。

コメントの投稿


画像の中に見える文字を入力してください。

トラックバックURL

http://www.isl.ne.jp/cgi-bin/mt/mt-tb.cgi/1790

サイト内検索

twitterTwitter

最新ブログ記事

2015年06月13日

JavaScriptの情報室

4冊目 ハイブリッドアプリが作れる。tabris.js

2014年10月16日

C++言語学習録

第3回 ファイルを分割してみよう

2014年10月09日

C++言語学習録

第2回 オブジェクト指向の復習

2014年10月02日

C++言語学習録

第1回 C++の開発環境を整える

2014年09月25日

Swiftを試してみようなう。

第4回 Swiftでクラスを使うなう。

ISL 情報戦略研究所

pagetopこのページの先頭へ戻る