Curs Avansat de Dezvoltare Python
Capitolul
>
Nivel
Decoratori
Lanțarea Decoratorilor
Obiectiv
Decorează acoperișul cu steaguri colorate prin alipirea decoratorilor.
Acoperișul beneficiază de puțin aer proaspăt după ce a fost închis în bucătărie atât de mult timp, iar unele linii nu au steaguri. Ar fi o idee bună să le instalezi în timp ce ești aici, însă poate fi complicat având în vedere că ai nevoie de diverse steaguri pentru a decora o linie. Poți realiza acest lucru prin alipirea decoratorilor.
Decoratorii sunt alipiti dublând semnele @, adică fixând mai mulți decoratori pe o singură funcție. De exemplu, acest lucru îți permite să inserezi o funcție între două funcții decorator:
# Listă pentru adăugarea steagurilor unei linii
line = []
# Decorator care adaugă un steag roșu
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 care adaugă un steag albastru
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
# Funcție decorată care adaugă linie și steagul din mijloc
@blue_flag
@red_flag
def middle_green():
line.append("green")
player.speak("A green flag has been added to the line")
Codul de mai sus ilustrează o funcție cu decoratorii alipiti, acești decoratori fiind integrați în funcție astfel încât, pe marginea liniei, sunt plasate steaguri albastre, stratul interior are steaguri roșii, iar în mijloc se adaugă un steag verde. Toate acestea sunt adăugate într-o listă numită line, acesta fiind modul folosit pentru a decora liniile cu steaguri.
Începe prin a te îndrepta spre semnul X de aur și folosește funcția read() pentru a verifica instrucțiunile listate pe stalpul de semnalizare. Aici ți se va spune ce steaguri să pui și unde, existând trei (3) tipuri diferite de steaguri colorate: "red", "green" și "blue". Fiecare linie va avea toate cele trei steaguri, unul (1) în mijlocul liniei, două (2) în linia interioară și două (2) în linia exterioară, rezultând un total de cinci (5) steaguri per linie, la fel ca linia predefinită din partea stângă jos a hărții.
Mergi spre semnul X luminos și folosește funcția collect() pentru a ridica "flags" din ladă. Continuă apoi mergând spre semnele X întunecate și, de la stânga la dreapta, începe să plasezi steagurile în ordinea descrisă în instrucțiunile citite anterior. Folosește funcțiile de mijloc pentru a realiza acest lucru, de exemplu: middle_green() creează o linie de steaguri astfel: ["blue", "red", "green" ,"red","blue" ]. Apoi folosește funcția place() pentru a fixa linia folosind lista line, astfel: place(line).
Între fiecare semn X, golește lista line folosind funcția clear(), astfel: line.clear(), acest lucru îți permite să refolosești lista fără a fi nevoie să creezi una nouă pentru fiecare linie. Ultimul semn X din dreapta necesită o funcție personalizată:
@
@
def middle_custom():
line.append( Insert append )
player.speak("%s flag has been added to the line"
% ( insert flag ))
Folosește cele două simboluri @ pentru a adăuga decoratori funcției, apoi completează apelul pentru adăugarea steagului și culoarea acestuia în șirul de caractere. Fă acest lucru conform instrucțiunilor de pe semn pentru a finaliza nivelul.