見出し画像

pythonデコレータについて

今回のnoteも勉強した記録を残したいと思います。

デコレータについてです。

デコレータとは関数を何度も呼び出すことが無いように装飾をしてあげるという処理になります。

下記に二つのコードを共有したいと思います。

デコレータを使わない場合(引数あり)

def print_datatime(f):
    def wrapper(base, height):
        print(f'開始:{datetime.datetime.now()}')
        f(base, height) # calcを呼び出している
        print(f'終了: {datetime.datetime.now()}')
    return wrapper
def calc(base, height):
    print(base * height / 2)
print_datatime(calc)(310# 二つ目の()で関数と定義して引数を渡す

デコレータを使う場合(可変長引数)

def print_datatime(f):
    def wrapper(*args, **kwargs):
        print(f'開始:{datetime.datetime.now()}')
        f(*args, **kwargs) # calc1を呼び出している
        print(f'終了: {datetime.datetime.now()}')
    return wrapper
@print_datatime
def calc1(a, b, c):
    print(a * b * c)
    
@print_datatime
def calc2(a, b, c, d):
    print(a * b * c * d)

calc1(3102)
calc2(31025)

*argsと**kwargsを引数として渡すことで引数の数を気にせずに処理をすることが出来ます。

@関数名とすることで上で定義した関数をどこでも呼び出すことが出来ます。何度も同じ関数を使用するときにデコレータは使用するので覚えておきましょう。

関数をデコレートする関数を「デコレーター関数」
装飾される側の関数を「デコレート対象の関数」と言います。

下記の二つのコードは同じ処理を行います。

@my_dacorator1
@my_dacorator2
def func():
    pass
func = my_dacorator1(my_dacorator2(func))

今回は以上になります。


この記事が参加している募集

この記事が気に入ったらサポートをしてみませんか?