2021/3/10:この記事は別のブログで投稿した記事を移動したものです。
Python 3.8にはデコレータと呼ばれる機能があります。代表的なものは@staticmethod
や@classmethod
であり、@名前
として関数やクラスの前に付けて使われます。
このデコレータ、実態は関数オブジェクトを返す関数なので自由に定義できます。例えば次のコードはtest_decorator
というデコレータを定義してfunc
関数に設定しています。test_decorator
デコレータはスクリプト内部で自身が設定された関数func
に渡された名前なし引数と名前付き引数を表示して、func
を呼び出さずに終了します。
def test_decorator(f): def wrapper(*args, **kwargs): print(f"test_decorator({type(f)})") print(f"args: {args}") print(f"kwargs: {kwargs}") print("") return wrapper @test_decorator def func1(): return func1() <# test_decorator(<class 'function'>) args: () kwargs: {} #> func1(123, arg1=456) <# test_decorator(<class 'function'>) args: (123,) kwargs: {'arg1': 456} #>
上のコードのようにデコレータは関数に与えられた引数を受け取り、その内容を変更することができます。そちらは色々な方がデコレータの例として書かれているので、各自検索してみてください。