Python | デコレータの使い方

公開日:2021/5/29

Pythonでは,関数の前にアットマーク(@)をつけることによって別の関数を返すことができる.この処理をデコレータと呼ぶ.以下にデコレータを用いた構文を作成する.

◆実施環境

Python 3.8.8

■デコレータの記述方法

デコレータの基本的な記述方法を以下に記載

def 関数1(): # デコレータの関数
  def wrapper(*args, **kwargs):
    print() # 関数1の処理1
    func(*args, **kwargs)
    print() # 関数1の処理2
  return wrapper

@関数1 # 1行目の関数名(関数1)を@の後ろに記載:デコレータの利用
def 関数2():
  関数2の処理

関数2の実行

■デコレータを利用した基本構文

#1の処理:2行目でデコレータのための関数の定義をする.4~6行目で関数の処理を作成する.9行目に,定義した関数(my_dec)に@をつけ,デコレータ関数を利用する.10行目に関数を定義し,12行目の関数処理が5行目に利用される.14行目で実際に関数を実行する.

# 1の処理 
def my_dec(func): # デコレータの関数の定義 
  def wrapper(*args,**kwargs): 
    print('Hi') # 関数の処理1 
    func(*args,**kwargs) # @以降の関数処理がここで出力される 
    print('Nice to see you') # 関数の処理2 
  return wrapper 

@my_dec 
def greeting(n): 
  print(f'This is {n}')

greeting(input('名前を入力してください'))

# 2の処理
def my_dec1(func):
  def wrapper(*args,**kwargs):
    print('$'*40)
    func(*args,**kwargs)
    print('$'*40)
  return wrapper

def my_dec2(func):
  def wrapper(*args,**kwargs):
    print('+'*40)
    func(*args,**kwargs)
    print('+'*40)
  return wrapper

@my_dec1
@my_dec2
def greeting(n):
  print(f'Hello,{n}')

greeting(input('名前を入力してください'))

■実行結果

# 1の結果
名前を入力してくださいTaro # 'Taro'を入力
Hi # 以下が出力
This is Taro
Nice to see you

# 2の結果
名前を入力してくださいJiro # 'Jiro'を入力
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
++++++++++++++++++++++++++++++++++++++++
Hello,Jiro
++++++++++++++++++++++++++++++++++++++++
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

以上