いよいよ独自のデコレータを書いてみよう｡
デコレータは関数の上位互換であることを忘れないでください｡
それは､ 単に他の関数をラップして､ それを強化したり変更したりする関数です｡
でも､ それがどういうものかを説明するには､ 実際に自分たちでコーディングしてみるのが一番です｡
では､ そうしましょう｡
マイを定義しよう｡
デコレータで､ このデコレータはすぐに関数を受け入れることになります｡
ここで今､ 高次関数であることを知るべきだろう｡
ここの内部で､ 関数を呼び出すことになります｡
しかし､ その前に､ この関数を別の関数でラップすることにします｡
そこで､ wrap関数を定義すると言うことになります｡
つまり､ これは単なるラッパーであり､ このラップ機能である｡
このファンクを単純に実行する機能になりそうです｡
そして､ 最後にラップ関数を返すだけです｡
ここで､ 私はそれを呼び出しているのではなく､ 後で誰かが使えるように返しているだけであることに注意してください｡
なるほど｡
さて､ 簡単な関数があるとしよう｡
こんにちは｡
そして､ このシンプルな機能は､ ただプリントするだけです｡
こんにちは｡
なんて無駄な機能なんだ｡
今すぐ
なぜ役に立つのか？
というのも､ これでpythonのデコレーターとして使えるようになったからです｡
この前にAを書くとすぐに､ おい､ これはデコレーターとデコレーターになるんだぞ､ と言うことになります｡
関数を受け取り､ ラッパー関数を持ち､ 関数を呼び出し､ ラッパー関数を返すというこの構文に従う限り､
使用することができるのです｡
だから､ もし私が私の装飾をしたら､ それがどのように青一色になるかを見ることができます｡
このデコレーターは､ 実際に関数を定義する際に使用することができます｡
そこで､ hello関数にデコレータを使いたい場合は､ 次のようにします｡
実行をクリックする｡
得ることができます｡
もしもし？
なるほど｡
という気持ちはわかります｡
完全に時間の無駄だと思ってるだろ､ アンドレ｡
なぜ､ そんなことをしなければならなかったのか？
こうすればよかったんだ｡
を定義すればいい｡
こんにちは｡
と､ いうことでした｡
とても困っています｡
さて､ ここからが本題です｡
先ほどのデコレーターの件｡
何も変わっていない｡
期待通りの働きをしてくれます｡
しかし､ これによって､ さらに機能を追加することができるようになったのです｡
デコレータは関数であり､ それをラップするのがデコレータであると言ったのを覚えているだろうか｡
そして､ それを高める｡
では､ どうすれば強化できるのか｡
もしもし？
さて､ このラップされた関数の中では､ 何でもできる｡
例えば､ printと言えば､ ここに星をプリントして､ printかもしれませんね｡
もう一つの星は､ 私が走ると呼ぶように､ ここにある｡
ブームです｡
を超強化したところです｡
こんにちは｡
機能です｡
なんてかっこいいんでしょう｡
そして､ この1行を加えるだけでデコレーターが使えるようになるわけです｡
関数をスーパーブーストして､ 例えば､ 別の関数を作るとします｡
さようなら｡
そして､ この買い物は印刷することになる｡
またね｡
こちらからお電話の上､ 実行をクリックしてください｡
まあ､ 何も変わらないんですけどね｡
でも､ スーパーブーストしようと思ったら､ ちょうど
こんにちは｡
あとは､ このデコレーターをコピーして､ ここでも使うだけです｡
実行すればいいように｡
これでよしとしよう｡
買い付けを超強化しました｡
これがデコレーターの力です｡
この構文を使うだけで､ 他の関数に機能を追加することができるんだ｡
今､ あなたが何を考えているのか､ 私は知っています｡
そして､ 私も何度も言っていることですが｡
心が読めるような気がするけど｡
これって､ 魔法がたくさんあるんじゃないかと思うでしょ？
Pythonインタプリタは､ これらのことをどのように行っているのでしょうか？
ような気がします｡
まあ､ マジックでしょう？
ボンネットの下
全ては､ そのためです｡
では､ お見せしましょう｡
これまで判明している機能からすると､ 一級市民だからです｡
そうですね｡
私たちがやっていることは､ 文字通りこれだけです｡
変数aと言っています｡
イコールです｡
もしもし？
そして､ このハローをラッピングして､ 私のデコレーターと呼んでいます｡
だから､ 私は自分の装飾品を言っているのです｡
そしてその後､ こんな感じで走っています｡
では､ これをハローとしましょう｡
まあ､ 走っているだけなんですけどね｡
そうそう｡
これを実行すればいいように｡
すべてがうまくいく
私がやっているのは､ hello関数をラップしているだけです｡
私のデコレーターで､ 変数に代入しています｡
順を追って見ていくと､ 私のデコレーターは関数を受け取っていることがわかります｡
この場合､ hello関数です｡
そして､ このhelloを含むラップされた関数を返します｡
そこで､ このラップ関数を返す｡
このラップされた関数が呼び出され､ それが何で呼び出されるかというと､ イコールになります｡
さて､ このように表示され､ 次にhello関数を実行し､ そしてこのように表示されます｡
というようなことをやっているのと同じです｡
単に呼び直すだけです｡
これを実行すると
効くんです｡
違和感がありますよね｡
しかし､ それは意味があるはずです｡
最初の関数を呼び出し､ 最初の関数が別の関数を返し､ 次の戻り関数であるラップ関数を呼び出しているのです｡
デコレータが便利な理由は､ このようなことをする代わりに､ 率直に言って混乱しているように見えますが､
私のデコレータで追加するだけで､ このようなことをする必要がないからです｡
うちのハローは内装屋さんが自動でラッピングしてくれるんですが､ 本来はアートシーンがやっていることなんです｡
ほらね｡
何のマジックでもない｡
今すぐ
これはいいことですが､ なぜデコレータが便利なのか､ まだ疑問に思っていることでしょう｡
それでは､ デコレータの理解を深めるために､ 一旦休憩して､ 次のビデオでお会いしましょう｡