デコレータ
デコレータは、既存の関数に何か追加動作を加える感じのもの。
例えば、実行時間を測って出力したり、"〜〜関数が実行されました"とかのメッセージを付け加えたりできます。
サンプル
今回は、出力にメッセを付け加えるものと実行時間計測を作りました
作ったコード:https://github.com/KodairaTomonori/Qiita/tree/master/default_module/syntax
メッセージを付け加える
deco = '。+゚+。・゚・。+*+。・★・。+*+。・===[ '
deco_end = deco.replace('[', ']')[::-1]
deco_result = [' ∧____∧ 結果を', '( `Д´ ) 出力するぞ', '(っ▄︻▇〓┳═ ', '/ )', '( / ̄∪']
def deco_func(func):
def decoration(*args, **kwargs):
print(deco + 'start ' + func.__name__ + deco_end)
for i in range(len(deco_result) ):
if i != 2: print(deco_result[i])
else: print(deco_result[i], func(*args, **kwargs) )
print(deco + 'end ' + func.__name__ + deco_end)
return decoration
@deco_func
def addition(a, b):
return '{} + {} = {}'.format(a, b, a + b)
if __name__ == '__main__':
addition(103842, 283746)
出力
デコレータは、deco_func
関数は、関数内で作ったdecoration
関数を返すものになってます。
decoration
は、始まりと終わりをprintして出力を飾っています。
func.__name__
で、関数名を取得できます。
また、(*args, **kwargs)
とすることで、大体の関数に対応できるようになってます。
デコレータとして使う場合には、関数の前に@deco_func
を付け加えるだけです。
こうすることで、addition
= deco_func(addition)(a, b)
となるわけです。
時間計測
#usr/bin/python
import time
def timer(func):
def print_time(*args, **kwargs):
start = time.time()
func(*args, **kwargs)
print(func.__name__ + \
'の実行にかかった時間は{}秒です'.format(time.time() - start) )
return print_time
@timer
def roop_timer(a):
return roop(a)
def roop(a):
sum_ = 0
for i in range(a):
sum_ += i
return sum_
if __name__ == '__main__':
roop_timer(10000)
timer(roop)(10000)
出力
roop_timerの実行にかかった時間は0.0008311271667480469秒です
roopの実行にかかった時間は0.0008249282836914062秒です
print_time
では、時間を計って、その結果を出力しています。
func.__name__
は、関数名をとってきてくれます。
@timer
を一部にしか反映させたくない場合は、timer(roop)(10000)
とすることで、同じ動作をすることになる。
また、roop_timer
のようにそれ専用の関数を作っても可能(二つ以上つかう時はこれ作ったほうが楽)。
まとめ
@decorate_function
を付け加えることで、簡単に関数に他の機能を付け加えることができる。