Pythonのデコレータってめちゃくちゃ難しいなーって思ってたけど、結局表題に帰結する。
「引数で関数を受け取って、関数を返す」とか難しいことを言っている記事が多かったけど、結局、その対象のメソッドを実行する前後に何をしたいかどうかだけ。
decorator.py
def foo(func: function):
def wrapper(*args, **kwargs):
print("事前に実行します。")
value = func(*args, **kwargs)
print("事後に実行します。")
return value
return wrapper
main.py
from decorator import foo
@foo
def bar():
print("barです。")
bar()
結果は、下記になる。
事前に実行します。
barです。
事後に実行します。
結局、barが実行される前に、fooのwrapperの関数が呼ばれるだけだ。
wrapperの引数は、barの引数依存をなくすためにあるだけ。
foo -> wrapper -> print("事前に実行します。")
-> func -> print("barです。")
-> wrapper -> print("事後に実行します。")