potisanのプログラミングメモ

プログラミング素人です。昔の自分を育ててくれたネット情報に少しでも貢献できるよう、情報を貯めていこうと思っています。Windows環境のC++やC#がメインです。

Python 3.8 デコレータ(decorator)の基本的な動作

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}
#>

上のコードのようにデコレータは関数に与えられた引数を受け取り、その内容を変更することができます。そちらは色々な方がデコレータの例として書かれているので、各自検索してみてください。