Pythonにはデコレートという機能があり、この機能をうまく活用することでデコレートするだけでログ出力するデコレーターなど多くの便利機能が実装出来きます。
本記事では、デコレーターの基本的な使用方法をサンプルコード交えて紹介します。
最後まで読むとデコレーターに指定した引数をメソッド側で使用する方法が解ります。
目次
【基本形】引数なしデコレーターのサンプルコード
ここでは、引数なしデコレーターのサンプルコードを紹介します。
import os
def getNewline():
'''
実行OS に合わせて改行コードを取得
Windows -> \r\n
LINUX -> \n
'''
if os.name == 'nt':
# windows の場合
return "\r\n"
else:
return "\n"
def deco_test1(func):
def wrapper(*args, **kwargs):
_out = "-- start --" + getNewline()
_out = _out + func(*args, **kwargs) + getNewline()
_out = _out + "-- end --"
return _out
return wrapper
# 開始と終了の印を付与するデコレーター
@deco_test1
def test():
return 'Hello Decorator!'
# デコレーターを付与したメソッドを実行
print(test())
この部分がデコレーターです。
print(test()) でデコレーターを付与したメソッドの実行結果を出力しています。
下記が出力されます。
test() が出力した文字列の先頭に”– start –“と、末尾に”– end –“が付与されていることが解ります。
【応用1】引数ありデコレーターのサンプルコード
つぎに、引数ありのデコレーターのサンプルコードを紹介します。
def deco_test2(_decarg1, _decarg2):
def _deco_test1(func):
def wrapper(*args, **kwargs):
_out = _decarg1 + getNewline()
_out = _out + func(*args, **kwargs) + getNewline()
_out = _out + _decarg2
return _out
return wrapper
return _deco_test1
# 開始と終了の印を付与するデコレーター
@deco_test2("開始", "終了")
def test_1():
return 'Hello Decorator!'
print(test_1())
この部分がデコレーターです。
print(test_1()) でデコレーターを付与したメソッドの実行結果を出力しています。
下記が出力されます。
test_1() が出力した文字列の先頭にデコレーターの第一引数に指定した”開始”と、末尾に第二引数に指定した”終了”が付与されていることが解ります。
【応用2】デコレーターに指定したキーワード引数をメソッドで使用するサンプルコード
つぎに、デコレーターで指定した引数をメソッドで使用するサンプルコードを紹介します。
def decfunc(_test):
return "***" + _test + "***"
def deco_test3(*args,**kwargs):
def _deco_test1(func):
def wrapper():
_out = "<dec>" + getNewline()
_out = _out + func(*args, **kwargs) + getNewline()
_out = _out + "</dec>"
return _out
return wrapper
return _deco_test1
@deco_test3(_intest=decfunc("Hello Decorator!"))
def test_2(_intest):
return _intest
print(test_2())
この部分がデコレーターです。
デコレーターに”_intest”という名称で指定したキーワード引数をtest_2()で使用しています。
print(test_2()) でデコレーターを付与したメソッドの実行結果を出力しています。
下記が出力されます。
デコレーターに指定したキーワード引数を使用していることが解ります。
【応用3】複数のデコレーターを入れ子で使用するサンプルコード
最後に複数のデコレーターを入れ子で使用するサンプルコードを紹介します。
@deco_test1
@deco_test2("開始", "終了")
@deco_test3(_intest=decfunc("Hello Decorator!"))
def test_3(_intest):
return _intest
print(test_3())
この部分がデコレーターです。
print(test_3()) で複数のデコレーターを付与したメソッドの実行結果を出力しています。
下記が出力されます。
これまで紹介した3つのデコレーターが実行されていることが解ります。
まとめ
本記事では、デコレーターの基本的な使い方を中心にサンプルコードを交えてデコレートに指定したキーワード引数をメソッド側で使用する方法を紹介しました。
ご参考になりましたら twitter をフォローして SNS でシェアして頂ければ幸いです。