- ある関数に、書き足すことなく機能を追加できる(関数の上書き)
- 本来は関数中に含めないほうがよいものをデコレーターで処理するなど
- デコレーターに必要なもの(4つ)
*args**kwargs- 関数内関数 ←高階関数ともいう?
- 関数を他の関数の中で定義する
- 引数としての関数
- 参考:入門Python3 4.9デコレーター
- 理屈より形おぼえたほうが理解しやすい
例1
# func_Aをデコレートする場合
def func_A(a,b):
print("...func_A...")
print(f"{a} + {b} =")
return a + b
def deco(func):
def add_message(*args, **kwargs): ・・・1、2 <===================
print("---deco_Start---")
result = func(*args, **kwargs) ・・・1、2 3. 関数内関数
print("---deco_End---")
return result
return add_message ←場所に注意 <====================
f = deco(func_A) ・・・4
r = f(10, 10) ←f(10, 10)だけだと、計算結果の20が表示されない
print(r)
Ans:
---deco_Start---
...func_A...
10 + 10 =
---deco_End---
20@deco
def func_A(a,b):
print("...func_A...")
print(f"{a} + {b} =")
return a + b
r = func_A(10, 10)
print(r)
Ans:
同様例2
def addition(a, b):
return a + b
def deco(func):
def inner(*args):
print("引数:", args)
return func(*args)
return inner
# f1 = deco(addition(1,2))ではない。引数がfuncのみなので当然
f1 = deco(addition)
print(f1(1,2))
#引数: (1, 2)
#3
@deco
def addition(a, b):
return a + b
f2 = addition(10, 10)
print(f2)
#引数: (10, 10)
#20