PythonのDecorators(デコレーター)について
まず、コードを見ながら動きを解説します。
関数で修飾する場合のコード例1:
{{{
def decoratorsTest(function):
print function.__name__
@decoratorsTest
def functionTest():
pass
}}}
出力結果:
functionTest
※修飾される関数の名「functionTest」が出力される
簡易解説:
1.@decoratorsTestが修飾対象の関数の直前にくる
2.decoratorsTestの引数「function」はfunctionTestと同じ
3.decorators(デコレーター)が呼び出されたときに関数が実行される
クラスで修飾する場合のコード例2:
{{{
class decoratorsTest:
def __init__(self, function):
self.function = function
self.saved = []
def __call__(self, *args):
try:
self.saved.append(args[0])
print "saved", self.saved
return self.function(*args)
except Exception, e:
print "Error %s" % (e)
@decoratorsTest
def functionTest(x):
return "args", x
print functionTest(1)
print functionTest(2)
}}}
出力結果:
saved [1]
('args', 1)
saved [1, 2]
('args', 2)
簡易解説:
1.decoratorsが宣言された時に、__init__(コンストラクタ)が呼び出される
2.decoratorsの直下の関すが呼ばれたときに、__call__される
3.出力結果のように、saved メンバー変数は保持され続ける
まず、コードを見ながら動きを解説します。
関数で修飾する場合のコード例1:
{{{
def decoratorsTest(function):
print function.__name__
@decoratorsTest
def functionTest():
pass
}}}
出力結果:
functionTest
※修飾される関数の名「functionTest」が出力される
簡易解説:
1.@decoratorsTestが修飾対象の関数の直前にくる
2.decoratorsTestの引数「function」はfunctionTestと同じ
3.decorators(デコレーター)が呼び出されたときに関数が実行される
クラスで修飾する場合のコード例2:
{{{
class decoratorsTest:
def __init__(self, function):
self.function = function
self.saved = []
def __call__(self, *args):
try:
self.saved.append(args[0])
print "saved", self.saved
return self.function(*args)
except Exception, e:
print "Error %s" % (e)
@decoratorsTest
def functionTest(x):
return "args", x
print functionTest(1)
print functionTest(2)
}}}
出力結果:
saved [1]
('args', 1)
saved [1, 2]
('args', 2)
簡易解説:
1.decoratorsが宣言された時に、__init__(コンストラクタ)が呼び出される
2.decoratorsの直下の関すが呼ばれたときに、__call__される
3.出力結果のように、saved メンバー変数は保持され続ける

コメントする