Fejlett Python fejlesztési tanfolyam
Fejezet
>
Szint
Dekorátorok
Dekorátorok láncolása
Célkitűzés
Díszítsd a tetőt színes zászlókkal dekorátorok láncolásával.
A tetőn jól jön egy kis friss levegő, miután ennyi ideig bezárva maradt a konyhában, egyes sorokból hiányoznak a zászlók. Jó ötlet lenne őket felállítani, miközben itt vagy, bár ez nem egyszerű, mivel többféle zászlóra van szükség a sor kialakításához.
Ezt dekorátorok láncolásával érheted el.
A dekorátorokat úgy láncoljuk, hogy megduplázzuk az @ jeleket, azaz egyetlen függvényhez több dekorátort is rögzítünk. Például ez lehetővé teszi, hogy egy függvényt két dekorátorfüggvény közé helyezzünk:
# 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")
A fenti kód egy olyan függvényt illusztrál, amelyhez láncolt dekorátorok vannak csatolva; ezek a dekorátorok úgy vannak beépítve a függvénybe, hogy a sor szélén kék zászlókat helyez el, a belső rétegen piros zászlókat, végül pedig a közepén egy zöld zászlót. Mindegyikhez hozzáadódik a line nevű listához, ez a módszer, amellyel a sorokra felállítjuk a zászlókat.
Kezdj a arany X jelzés felé sétálva, és használd a read() függvényt, hogy ellenőrizd a táblán feltüntetett utasításokat. Itt megtudhatod, hova melyik zászlót kell elhelyezned, hiszen három (3) különböző színű zászló van: "red", "green" és "blue". Minden sorban mindhárom zászló szerepelni fog: egy (1) a sor közepén, kettő (2) a belső részen, és kettő (2) a külső részen, összesen öt (5) zászlóval, hasonlóan a térkép alsó bal oldalán található előre elkészített sorhoz.
Sétálj a világos X jelzés felé, és használd a collect() függvényt, hogy összegyűjtsd a ládában lévő "flags" zászlókat. Ezt követően sétálj a sötét X jelzések felé, és balról jobbra kezdd el elhelyezni a zászlókat abban a sorrendben, ahogy az előbb elolvasott utasításokban szerepelt. Ehhez használd a középső függvényeket, például: a middle_green() ilyen zászlósort hoz létre: ["blue", "red", "green" ,"red","blue" ]. Ezután használd a place() függvényt a line lista felhasználásával a sor elhelyezéséhez, így: place(line).
Minden X jelzés között töröld a line listát a clear() függvény használatával, így: line.clear(), ez lehetővé teszi, hogy újrahasználd a listát anélkül, hogy minden sorhoz újat kellene készítened. A jobb oldali utolsó X jelzésnél egy egyedi függvény szükséges:
@
@
def middle_custom():
line.append( Insert append )
player.speak("%s flag has been added to the line"
% ( insert flag ))
Használd a két @ jelet a dekorátorok hozzáadásához a függvényhez, majd töltsd ki a sorhoz hozzáfűzendő elemet és a zászló színét a szövegben. Ezt tedd az előzőleg elolvasott utasításoknak megfelelően a szint teljesítéséhez.