Edistynyt Python-kehityskurssi
Luku
>
Taso
Dekoraattorit
Dekoraattoreiden ketjuttaminen
Tavoite
Korista katto värillisillä lipuilla ketjuttamalla dekorattorit.
Katto saa taas raikasta ilmaa sen jälkeen, kun se on ollut vangittuna keittiössä niin pitkään, ja joiltakin linjoilta puuttuvat liput. Olisi hyvä idea asettaa ne paikalleen sillä välin, mutta se voi olla hankalaa, sillä linjan asettamiseen tarvitaan erilaisia lippuja. Tämä onnistuu ketjuttamalla dekorattorit.
Dekorattorit ketjutetaan kaksinkertaistamalla @-merkit, eli kiinnittämällä useita dekorattoreita yhdelle funktiolle. Esimerkiksi tämä mahdollistaa funktion laittamisen kahden dekoratorifunktion väliin:
# 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")
Yllä oleva koodi havainnollistaa funktiota, johon on kiinnitetty ketjutetut dekorattorit. Näitä dekorattoreita kudotaan funktioon siten, että linjan reunoille asetetaan siniset liput, sisäkerrokseen lisätään punaiset liput ja lopuksi keskelle vihreä lippu. Kaikki lisätään listaan nimeltä line, ja tätä menetelmää käytetään lippujen asettamiseen linjoille.
Aloita kävelemällä kultaiseen X-merkkiin ja käyttämällä read()-funktiota tarkistaaksesi opasteen ilmoittamat ohjeet. Tässä kerrotaan, mihin lippuja asetetaan, sillä on olemassa kolme (3) erilaista värillistä lippua: "red", "green" ja "blue". Jokaisella linjalla on kaikki kolme lippua: yksi (1) keskellä, kaksi (2) sisemmällä ja kaksi (2) ulommalla, jolloin linjalla on yhteensä viisi (5) lippua, aivan kuten kartan vasemman alakulman valmiissa linjassa.
Kävele vaaleaan X-merkkiin ja käytä collect()-funktiota poimiaksesi laatikosta "flags". Jatka kävelemällä tummiin X-merkkeihin ja vasemmalta oikealle alkaen aseta lippuja siinä järjestyksessä, kuin aiemmin lukemissasi ohjeissa on kuvattu. Käytä keskitoimintoja tämän saavuttamiseksi, esimerkiksi: middle_green() luo lippulinjan seuraavasti: ["blue", "red", "green" ,"red","blue" ]. Käytä place()-funktiota asettaaksesi linjan käyttäen line-listaa, kuten tässä: place(line).
Jokaisen X-merkin välillä tyhjennä line-lista käyttämällä clear()-funktiota, kuten tässä: line.clear(). Näin voit käyttää listaa uudelleen ilman, että sinun tarvitsee luoda uusi jokaista linjaa varten. Kartan oikealla oleva viimeinen X-merkki vaatii mukautetun funktion:
@
@
def middle_custom():
line.append( Insert append )
player.speak("%s flag has been added to the line"
% ( insert flag ))
Käytä kahta @-merkkiä lisätäksesi dekorattorit funktiolle, ja täydennä sen jälkeen line.append-osion sekä merkintämerkkijonon lipun väri. Tee tämä opasteessa annettujen ohjeiden mukaisesti tason loppuun saattamiseksi.