調べてもいまいちわかりにくいデコレータについて
デコレータの機能
デコレータという名前が聞き慣れないのでわかりにくい気がします。
別の関数の中に関数を埋め込むショートカットとして捉えるとわかりやすい気がします。
処理1や処理2がある関数Aの中に別の関数Bを埋め込むためにショートカットを作成します。
関数A
処理1
:
ショートカット先
処理2
@関数A (埋め込み先を指定)
関数B
処理3
関数Bを実行すると関数Aと埋め込まれている位置で関数Bが実行されます。
関数Bを実行すると
関数A
処理1
:
ショートカット先 → 関数B (処理3)
処理2
デコレータの実際の例
言葉の説明をみても逆にわかりにくいので実例を見たほうが分かりやすいです。
pan_cake関数は「パンケーキ!!」と出力する関数です。
このパンケーキをいちごや生クリームでデコレーションするためにデコレータを作ります。
お皿の上に載せて、パンケーキの上にいちごと生クリームを載せるのが以下のコードです。
#dessert_decoがデコレータ
def dessert_deco(func): # デコレータを定義 my_decorator()関数の引数には、デコレートされる関数(func)が渡される funcはネストした関数wrapper()に記述
def decorations(): # デコレートされる関数をラップする関数を定義
print("いちご") #装飾の処理
print("生クリーム") #装飾の処理
func() # デコレートされる関数を実行
print("お皿") #装飾の処理
return decorations # デコレートされる関数を返す 返すのは自身の関数名
#以下はデコレートされる関数(pan_cake)
@dessert_deco # デコレータの関数名を@の後に記述
def pan_cake(): # デコレートされる関数を定義
print("パンケーキ!!") # デコレートされる関数の処理
#デコレートされる関数(pan_cake)を実行するとデコレーションされる
pan_cake() # デコレートされる関数を実行
以下がpac_cake関数の実行結果です。
いちご
生クリーム
パンケーキ!!
お皿
dessert_decoでデコレーションしないと「パンケーキ!!」だけになります。