上級Python開発コース
チャプター
>
レベル
デコレーター
デコレーターの連鎖
目的
デコレータを連鎖させて、色付きの旗で屋根を飾ろう。
あのキッチンに長い間閉じ込められていた後、屋根には新鮮な空気が流れていますが、いくつかのラインには旗がありません。ここにいるうちにそれらを設置するのは良い考えですが、各ラインに様々な旗が必要なため、少々手間がかかります。
これを実現するには、デコレータを連鎖させます。
デコレータは @ 記号を重ねることで連鎖され、すなわち、1 つの関数に対して複数のデコレータを適用します。例えば、これによりある関数を 2 つのデコレータ関数で挟むことができます:
# List to add flags to a line
line = []
# Decorator adding a red flag
def red_flag(func):
def add_flag():
line.append("red")
player.speak("Two red flags added to the line")
func()
line.append("red")
return add_flag
# Decorator adding a blue flag
def blue_flag(func):
def add_flag():
line.append("blue")
player.speak("Two blue flags added to the line")
func()
line.append("blue")
return add_flag
# Decorated Function adding line and middle flag
@blue_flag
@red_flag
def middle_green():
line.append("green")
player.speak("A green flag has been added to the line")
上記のコードは、連鎖されたデコレータが付いた関数を示しています。これらのデコレータは関数内に組み込まれており、ラインの端には青い旗が、内側には赤い旗が、そして中央には緑の旗が配置されます。これらはすべて line という名前のリストに追加され、これがライン上に旗を設置する方法となります。
まず、ゴールドの X マークまで歩き、read() 関数を使用して案内板に記された指示を確認してください。ここでは、どこにどの旗を設置すべきかが示されており、"red"、"green"、"blue" の 3 種類の色付き旗が存在します。各ラインには、中央に 1 つ、内側に 2 つ、外側に 2 つの旗が配置され、合計で 5 つの旗が設置されます。これは、マップの左下にある既成のラインと同様です。
ライトの X マークまで歩き、collect() 関数を使用してクレート内の "flags" を取得してください。その後、ダークの X マークまで歩き、左から右へ、先ほど読んだ指示に従って旗を順番に配置します。このために中央の関数を使用します。例えば、middle_green() は以下のような旗のラインを生成します: ["blue", "red", "green" ,"red","blue" ] 。そして line リストを使ってラインを設置するために place() 関数を使用します: place(line) .
各 X マークの間に clear() 関数を使用して line リストをクリアしてください。例えば、line.clear() のようにします。これにより、各ラインごとに新しいリストを作成することなく、同じリストを再利用できます。右端の最後の X マークではカスタム関数が必要です:
@
@
def middle_custom():
line.append( Insert append )
player.speak("%s flag has been added to the line"
% ( insert flag ))
関数にデコレータを追加するために、二つの @ 記号を用いてください。その後、line.append と文字列内の旗の色を記入します。これを案内板の指示に従って行い、レベルをクリアしてください。