デコレーター

投稿者: | 2022-07-12
  • ある関数に、書き足すことなく機能を追加できる(関数の上書き)
  • 本来は関数中に含めないほうがよいものをデコレーターで処理するなど
  • デコレーターに必要なもの(4つ)
    1. *args
    2. **kwargs
    3. 関数内関数 ←高階関数ともいう?
      • 関数を他の関数の中で定義する
    4. 引数としての関数
  • 参考:入門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