[解決済み] デコレータの実行順序
質問
def make_bold(fn):
return lambda : "<b>" + fn() + "</b>"
def make_italic(fn):
return lambda : "<i>" + fn() + "</i>"
@make_bold
@make_italic
def hello():
return "hello world"
helloHTML = hello()
出力します。
"<b><i>hello world</i></b>"
私はデコレータについて、また、ほとんどの例でそのうちの1つを使ってどのように動作するかについて、おおよそ理解しています。
この例では、2つあります。出力から、どうやら
@make_italic
が最初に実行され、次に
@make_bold
.
これは、装飾された関数に対して、まずその関数を実行し、その後、他の装飾のために先頭に移動するということでしょうか?例えば
@make_italic
が最初に実行され、次に
@make_bold
というように、逆ではなく
ということは、ほとんどのプログラミング言語におけるトップダウンアプローチの規範とは異なるということでしょうか。このデコレータの場合だけ?それとも、私が間違っているのでしょうか?
どのように解決するのですか?
デコレータ
ラップ
というように、デコレートする関数を指定します。そのため
make_bold
の結果を装飾し
make_italic
を装飾するデコレータです。
hello
関数を装飾します。
は
@decorator
の構文は、実際には単なる構文上の糖分であり、次のようになります。
@decorator
def decorated_function():
# ...
は本当は次のように実行されます。
def decorated_function():
# ...
decorated_function = decorator(decorated_function)
を置き換えると、元の
decorated_function
オブジェクトを
decorator()
を返します。
デコレータを積み重ねることで、その処理を繰り返す 外側に .
では、あなたのサンプル。
@make_bold
@make_italic
def hello():
return "hello world"
を展開することができる。
def hello():
return "hello world"
hello = make_bold(make_italic(hello))
を呼び出すと
hello()
で返されるオブジェクトを呼び出しています。
make_bold()
が返すオブジェクトを呼び出しています。
make_bold()
が返されました。
lambda
を呼び出し、その関数
make_bold
をラップしたもので、その返り値は
make_italic()
を呼び出すラムダでもあり、元の
hello()
. これらの呼び出しをすべて展開すると、次のようになります。
hello() = lambda : "<b>" + fn() + "</b>" # where fn() ->
lambda : "<i>" + fn() + "</i>" # where fn() ->
return "hello world"
となるので、出力は
"<b>" + ("<i>" + ("hello world") + "</i>") + "</b>"
関連
-
[解決済み] Pythonプログラムの実行時間を取得するにはどうしたらいいですか?
-
[解決済み] Pythonでシングルトンを作成する
-
[解決済み] Pythonの@propertyデコレーターはどのように機能するのでしょうか?
-
[解決済み] Pandasのデータフレームでタプルの列を分割するにはどうしたらいいですか?
-
[解決済み] 2つの線分が交差しているかどうかを確認するにはどうすればよいですか?
-
[解決済み] Django のテストデータベースをメモリ上だけで動作させるには?
-
[解決済み] なぜ(0-6)は-6=偽なのか?重複
-
[解決済み] Python 2.7サポート終了?
-
[解決済み] PySparkでデータフレームのカラムをString型からDouble型に変更する方法は?
-
[解決済み] あるメソッドが複数の引数のうち1つの引数で呼び出されたことを保証する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Pythonの@propertyデコレーターはどのように機能するのでしょうか?
-
[解決済み] 2つの線分が交差しているかどうかを確認するにはどうすればよいですか?
-
[解決済み] 小数点以下1桁を取得する[重複]。
-
[解決済み] SQLAlchemy: 日付フィールドをフィルタリングする方法は?
-
[解決済み] Pythonで0xを使わずにhex()を使うには?
-
[解決済み] pandasのタイムゾーンに対応したDateTimeIndexを、特定のタイムゾーンに対応したナイーブなタイムスタンプに変換する。
-
[解決済み] PyQtアプリケーションのスレッド化。QtスレッドとPythonスレッドのどちらを使うか?
-
[解決済み] Pythonの文字列の前にあるbという接頭辞は何を意味するのですか?
-
[解決済み] Django filter queryset __in for *every* item in list
-
[解決済み] 新しいpip backtrackingの実行時問題の解決