Pokročilý kurz vývoje v Pythonu
Kapitola
>
Úroveň
Dekorátory
Řetězení dekorátorů
Cíl
Ozdobte střechu barevnými vlajkami řetězením dekorátorů.
Střecha si dopřála čerstvý vzduch poté, co byla tak dlouho zavřená v té kuchyni, a některé linie nemají vlajky. Bylo by dobré je nastavit, zatímco jste tady, ale může to být náročné, protože potřebujete různé vlajky k vytvoření jedné linie. Toho dosáhnete řetězením dekorátorů.
Dekorátory se řetězí zdvojením znaků @, tj. přiřazením více dekorátorů k jedné funkci. Například to umožňuje vložit funkci mezi dvě dekorátorské funkce:
# 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")
Výše uvedený kód ilustruje funkci s připojenými řetězenými dekorátory, kdy jsou dekorátory vloženy do funkce tak, že na okrajích linie se umístí modré vlajky, vnitřní vrstva obsahuje červené vlajky a nakonec uprostřed je umístěna zelená vlajka. Všechny jsou přidány do seznamu nazvaného line, což je metoda, která se použije k nastavení vlajek na liniích.
Začněte tak, že se vydáte ke zlaté značce X a pomocí funkce read() si přečtete pokyny uvedené na ceduli. Zde se dozvíte, jaké vlajky kam umístit, přičemž existují tři (3) různé typy barevných vlajek: "red", "green" a "blue". Každá linie bude mít všechny tři vlajky, jednu (1) uprostřed linie, dvě (2) uvnitř linie a dvě (2) na vnější straně, což dává celkem pět (5) vlajek na linii, podobně jako předpřipravená linie v levém dolním rohu mapy.
Vydejte se ke světlé značce X a použijte funkci collect() k sebrání "flags" z bedny. Poté se vydejte k tmavým značkám X a zleva doprava začněte umisťovat vlajky v pořadí, jaké bylo popsáno v pokynech, které jste si předtím přečetli. K dosažení tohoto použijte odpovídající prostřední funkce, například: middle_green() vytvoří řadu vlajek takto: ["blue", "red", "green" ,"red","blue" ]. Následně použijte funkci place() k nastavení linie pomocí seznamu line, takto: place(line).
Mezi každou značkou X vyčistěte seznam line pomocí funkce clear(), například: line.clear(). Tímto způsobem můžete znovu použít tento seznam, aniž byste museli vytvářet nový pro každou linii. Poslední značka X napravo vyžaduje vlastní funkci:
@
@
def middle_custom():
line.append( Insert append )
player.speak("%s flag has been added to the line"
% ( insert flag ))
Použijte dva symboly @ k přidání dekorátorů do funkce, poté vyplňte příkaz line.append a barvu vlajky ve stringu. Postupujte podle pokynů na ceduli, abyste úroveň dokončili.