2021年11月04日 更新

デコレータ

どうも、クラゲジュニアです。

デコレータとは

既存の関数に対して機能を追加・変更するための機能。 元の関数の処理内部に手を加えずに機能を追加・変更できるという点が大きなメリットがある。 @で表現する。

def print_info(func):
    def wrapper(*n):
        print('start')
        result = func(*n)
        print('end')
        return result
    return wrapper

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

r = add_num(10, 20)
print(r)
start
end
30

サンプル

デコレータを複数設定することも可能。

def print_more(func):
    def wrapper(*args):
        print('name : ', func.__name__)
        print('args : ', args)
        result = func(*args)
        print('result :', result)
        return result
    return wrapper

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

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

r = add_num(10, 20)
print(r)
name :  wrapper
args :  (10, 20)
start
end
result : 30
30

デコレータの順番を変更すると実行される順番も変更される。

def print_more(func):
    def wrapper(*args):
        print('name : ', func.__name__)
        print('args : ', args)
        result = func(*args)
        print('result :', result)
        return result
    return wrapper

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

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

r = add_num(10, 20)
print(r)
start
name :  add_num
args :  (10, 20)
result : 30
end
30

以上です。