1. ホーム 
  2. 備忘録 
  3. Python

デコレータ

デコレータとは

デコレータとはある関数を修飾するための関数のその仕組みのことである

デコレータの使い方について以下に記載する


def print_info(func):
    def wrapper(*args, **kwargs):
        print('start')
        result = func(*args, **kwargs)
        print('end')
        return result

    return wrapper


@print_info
def add_num(a, b):
    return a + b


@print_info
def sub_num(a, b):
    return a - b


r = add_num(10, 20)
print(r)
r = sub_num(100, 24)
print(r)
# 結果
# start
# end
# 30
# start
# end
# 76
"""
ある関数に対して前後またはどちらかに処理を修飾したいときに使用する
@print_info の部分は
f = print_info(add_num)
という処理と同等のことをしている

デコレータのメリットは違うファンクションを作ったときに同じ修飾部分の処理を使いまわせることである
上の例でいうと add_num と sub_num に同様の処理を修飾することができている点である
"""

デコレータはデコレータとさらに組み合わせることができる

この際、記載の順番によって修飾処理の順番が変化することに注意すること


# ハイフンでデコレート
def decorate_hyphen(func):
    def wrapper(*args, **kwargs):
        print('--------------')
        result = func(*args, **kwargs)
        print('--------------')
        return result

    return wrapper


# アスタリスクでデコレート
def decorate_asterisk(func):
    def wrapper(*args, **kwargs):
        print('**************')
        result = func(*args, **kwargs)
        print('**************')
        return result

    return wrapper


@decorate_hyphen
@decorate_asterisk
def hyphen_and_asterisk_print(message):
    return print(f'>{message}<')


@decorate_asterisk
@decorate_hyphen
def asterisk_and_hyphen_print(message):
    return print(f'>{message}<')


# ハイフンが先のパターン
hyphen_and_asterisk_print("Hello,world!")
# 結果
# --------------
# **************
# >Hello,world!<
# **************
# --------------

# アスタリスクが先のパターン
asterisk_and_hyphen_print("Hello,world!")
# 結果
# **************
# --------------
# >Hello,world!<
# --------------
# **************