Курс по усъвършенствано разработване с Python
Глава
>
Ниво
Декоратори
Свързване на декоратори
Цел
Украсете покрива с оцветени знаменца чрез свързване на декоратори.
Покривът отново пое свеж въздух след като беше ограничен в тази кухня толкова дълго време, някои от линиите нямат знаменца. Би било добра идея да ги поставите, докато сте тук, но може да е предизвикателство, тъй като се нуждаете от различни знаменца, за да оформите една линия. Това може да се осъществи чрез свързване на декоратори.
Декораторите се свързват чрез удвояване на знаците @, тоест, прикачване на няколко декоратора към една функция. Например, това позволява да „запечатате“ една функция между две декоратор-функции:
# 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")
Кодът по-горе илюстрира функция с прикачени верижно декоратори. Тези декоратори се вплитат във функцията така, че по краищата на линията да се поставят сини знаменца, вътрешният слой да се украсява с червени знаменца, а в средата да се поставя зелено знаме. Всички те се добавят към списък с име line, който представлява метода за поставяне на знаменцата по линиите.
Започнете, като се придвижите до златната X-маркировка и използвате функцията read(), за да проверите инструкциите, изложени на пътния знак. Там ще ви бъде казано кои знаменца къде да поставите, като има три (3) различни вида оцветени знаменца: "red", "green" и "blue". Във всяка линия ще има всички три знаменца – едно (1) в средата на линията, две (2) в вътрешната линия и две (2) в външната линия, което прави общо пет (5) знаменца на линия, както при предварително зададената линия в долния ляв ъгъл на картата.
Отидете до светлата X-маркировка и използвайте функцията collect(), за да вземете знаменцата, намиращи се в кашона. След това се придвижете към тъмните X-маркировки и отляво надясно започнете да поставяте знаменцата в реда, описан в инструкциите, които прочетохте по-рано. Използвайте съответните функции за средната част, за да постигнете това, например: middle_green() създава линия от знаменца, както следва: ["blue", "red", "green" ,"red","blue" ]. След това използвайте функцията place(), за да поставите линията, използвайки списъка line, както следва: place(line).
Между всяка X-маркировка изчистете списъка line, като използвате функцията clear(), както следва: line.clear(). Това ви позволява да използвате списъка отново, без необходимостта да създавате нов за всяка линия. Последната X-маркировка отдясно изисква специална функция:
@
@
def middle_custom():
line.append( Insert append )
player.speak("%s flag has been added to the line"
% ( insert flag ))
Използвайте двата символа @, за да добавите декоратори към функцията, и след това попълнете 'line.append' и цвета на знаменцето в низа. Направете това в съответствие с инструкциите на знака, за да завършите нивото.