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
以上です。