Address
304 North Cardinal St.
Dorchester Center, MA 02124
Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM
Address
304 North Cardinal St.
Dorchester Center, MA 02124
Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM
Pythonのデコレータの基本については、前回の記事「【Python入門】デコレータの基本をわかりやすく解説」にて説明しましたが、実はそのデコレータは重ねて使うことが可能となります。
そんな多重デコレータとも言うべき使い方について今回は解説します。
デコレータの基本については、記事「【Python入門】デコレータの基本をわかりやすく解説」で説明しましたので、この記事を読む前に読んでみてください。
まず上記事「【Python入門】デコレータの基本をわかりやすく解説」で、公式ドキュメントによるデコレータの定義を紹介しましたが、そこには、
(デコレータ) 別の関数を返す関数で、通常、
Python公式ドキュメント:用語集@wrapper
構文で関数変換として適用されます
と書かれていました。
このうち、多重デコレータを理解するためには、デコレータとは「関数を返す関数」という部分が一番の要点となります。
そもそもデコレータとは、ある関数を変更するための特別な関数でした。デコレータによって返ってくるのも関数です。ならば、その返ってくる関数をもデコレートすることが理屈上は可能です。
そして実際にそれは可能です。次の使用例を見てください。
多重デコレータは、デコレータ関数を定義したうえで、
def デコレータ3
・・・
def デコレータ2
・・・
def デコレータ1
・・・
@デコレータ3
@デコレータ2
@デコレータ1
def デコーレーションされる関数():
・・・
と使います。
次に具体例を示します。以下のコードは記事「【Python入門】デコレータの基本をわかりやすく解説」で使ったものをそのまま再利用しています。そして、そのコードに少し追加した部分があるだけです。
# 追加部分1
def dcrtr_2(decorated_fnc):
def wrapper(c, d):
return decorated_fnc(c, d)*3
return wrapper
def dcrtr(target_fnc):
def fnc_1(a, b):
return target_fnc(a, b)+3
return fnc_1
@dcrtr_2 # 追加部分2
@dcrtr
def add(x, y):
return x*y
add(1, 2) # 結果:15
追加したコードは、
def dcrtr_2(decorated_fnc):
def wrapper(c, d):
return decorated_fnc(c, d)*3
return wrapper
と、
@dcrtr_2
だけです。
これについて次の画像を見て下さい。
まず1つめのデコレータ「@dcrtr」によって、画像①の部分が、画像②のように変化するイメージです。実際はちょっと異なるのですがあくまでイメージとしてつかんでください。
これにより、2つめのデコレータ「@dcrtr_2」から下のコードが実質的には、
@dcrtr_2
def~
というように、通常のデコレータの形に変化するというイメージです。
関数はデコレータによってデコレーションできます。そしてデコレータはあくまで、別の関数を返す「関数」です。よって、1つのデコレータによってデコレーションされた結果として生まれた関数であっても、さらに別のデコレータによってデコレーションすることが可能となるわけですね。
プログラミングを学びIT業界へ転職するなら現役エンジニアから学べるプログラミングスクールTechAcademy [テックアカデミー]でオンライン講座を受講するのが良いと思います。1人で悩みながら学習を進めるよりもわかりやすく、費やす時間も少なく合理的・効率的に学習できるからです。
など各種の講座が用意されています。無料で体験できるテックアカデミー無料体験も用意されています。