main()上記を保存して実行してみよう。いう名前が出力された。使うと、置き換える関数が元の関数の性質を引き継げる。マーキングもう一つの用途としてマーキングを見てみよう。この用途では、デコレータは受け取ったオブジェクトをそのまま返す。受け取ったオブジェクトを何処かに記録しておいて、それを後から利用することになる。いうリストに保存される。保存されたリストから関数を呼び出している。main()上記を保存して実行してみよう。デコレートした関数がリストに保存されて、それを後から呼び出すことができている。morning!マーキング用途のデコレータは、典型的にはイベントハンドラで用いられる。マーキングした関数がクライアントからのアクセスを捌くハンドラになる。上記のコードもデコレータを使わない形に直せる。main()上記を見て分かる通り、デコレータはモジュールが読み込まれるタイミングで解釈される。そのため、あらかじめデコレートされた関数の情報を収集するようなこともできるというわけ。関数以外で作るデコレータここまで紹介してきたデコレータは、全て関数を使って実装されていた。デコレータはそれ以外を使った作り方もある。メソッドで作るデコレータ例えば、以下のサンプルコードを見てほしい。いうインスタンスメソッドでデコレータを実装している。内容は最初に自作した処理の前後に出力を挿入するものだ。main()上記を保存して実行してみよう。デコレータとして機能していることが分かる。World!afterインスタンスメソッドとしてデコレータを実装すると嬉しいのは、インスタンスごとにコンテキストを持たせられるところ。いう二つのインスタンスは、それぞれ異なる引数で初期化されている。それぞれが別の関数をデコレートしている。main()上記を保存して実行してみよう。すると、初期化したときの引数によってデコレートされた結果が異なっていることが分かる。afternoonafterこのようにインスタンスメソッドでデコレータを作ると、インスタンスにコンテキストをもたせられるというメリットがある。呼び出し可能オブジェクトで作るデコレータメソッドで作るデコレータの変わり種として、呼び出し可能オブジェクトを使うパターンも考えられる。この特殊メソッドを実装すると、インスタンス自体を関数みたいに実行できるようになる。デコレータとして動作するとしたら?という。デコレータとして動作する。そのままデコレータとして使えている。main()実行結果はこれまでと変わらないので省略する。デコレートする対象ここまでの例では、デコレートする対象は全て関数だった。デコレータは関数以外もデコレートすることができる。デコレータがインスタンスメソッドをデコレートしている。main()上記を保存して実行してみよう。World!afterちなみにメソッドをデコレートするときの注意点が一つある。それは、置き換える関数の第一引数にインスタンスオブジェクトを受け取れるようにすること。いう名前で第一引数にインスタンスを受け取る。置き換える関数が、この一つ余分な引数を受け取れるようになっていないと動作しない。いう任意の形で受け取れるようにしていたので、特に気にすることはなかった。クラスをデコレートするデコレータはクラスをデコレートすることもできる。デコレータでは、クラスが持っているメソッドを上書きして回っている。上書きされたメソッドは、呼び出されたタイミングでその旨が出力されるようになる。main()上記を保存して実行してみよう。上書きされたメソッドによって、呼び出しが記録されていることが分かる。evening!まとめ今回扱った内容は以下の通り。用途はラッピングとマーキングの二つに大別できるデコレータの種類デコレータは関数、メソッド、インスタンスで作れるデコレータの対象デコレートできるのは関数、メソッド以外にクラスもある上記さえ理解していれば、あとは目的に応じてどのようなデコレータを作れば良いかが自動的に決まる。未処理の例外が上がったときの処理をオーバーライドする注目記事スポンサードリンクスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。