Avanceret Python Udviklingskursus
Kapitel
>
Niveau
Dekoratorer
Kædende Dekoratorer
Mål
Dekorer taget med farvede flag ved at kæde dekoratører sammen.
Taget har fået noget frisk luft efter at have været inde i det køkken så længe; nogle af linjerne har ikke flag. Det ville være en god idé at sætte dem op, mens du er her, men det kan være vanskeligt, da du skal bruge forskellige flag for at sætte en linje op. Du kan opnå dette ved at kæde dekoratører sammen.
Dekoratører kædes ved at fordoble @-tegnene, det vil sige ved at fastgøre flere dekoratører til en enkelt funktion. For eksempel tillader dette dig at placere en funktion mellem to dekoratørfunktioner:
# 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")
Koden ovenfor illustrerer en funktion med kædede dekoratører knyttet til, hvor disse dekoratører er indvævet i funktionen, således at der placeres blå flag i linjens yderkanter, røde flag i den indre del, og til sidst et grønt flag i midten. De tilføjes alle til en liste, der hedder line, og dette er metoden, der vil blive brugt til at sætte flagene på linjerne.
Start med at gå hen til det gyldne X-mærke og brug funktionen read() for at tjekke de instruktioner, der står på skiltet. Her vil du få oplyst, hvilke flag der skal sættes hvor, idet der er tre (3) forskellige typer farvede flag: "red", "green" og "blue". Hver linje vil have alle tre flag, et (1) i midten af linjen, to (2) i den indre linje og to (2) i den ydre linje, hvilket giver i alt fem (5) flag per linje, ligesom den forudkonfigurerede linje i nederste venstre hjørne af kortet.
Gå hen til det lyse X-mærke og brug funktionen collect() for at hente "flags" fra kassen. Fortsæt derefter med at gå hen til de mørke X-mærker, og fra venstre mod højre skal du begynde at placere flagene i den rækkefølge, der blev beskrevet i de instruktioner, du læste tidligere. Brug de midterste funktioner for at opnå dette, for eksempel: middle_green() skaber en flaglinje som dette: ["blue", "red", "green", "red", "blue"]. Brug derefter funktionen place() til at sætte linjen ved at benytte listen line, således: place(line).
Mellem hver X-mærke skal du rydde listen line ved at bruge funktionen clear(), således: line.clear(). Dette gør det muligt at genbruge listen uden at skulle oprette en ny til hver linje.
Den sidste X-mærke til højre kræver en specialfunktion:
@
@
def middle_custom():
line.append( Insert append )
player.speak("%s flag has been added to the line"
% ( insert flag ))
Brug de to @-symboler til at tilføje dekoratører til funktionen, og fortsæt derefter med at udfylde line.append og farven på flaget i strengen. Gør dette i overensstemmelse med instruktionerne på skiltet for at fuldføre niveauet.