Coding for KidsCoding for Kids
创意关卡挑战教师指南
为功能投票
高级 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() 函数从箱子中收集 "flags"。接着,走向深色的 X 标记处,并从左到右开始按照你之前阅读指示中描述的顺序依次放置旗帜。使用中间的函数来实现这一点,例如:middle_green() 会生成如下的旗帜序列: ["blue", "red", "green" ,"red","blue" ]。然后使用 place() 函数,通过传入 line 列表来放置旗帜,如这样:place(line)

在每个 X 标记之间,使用 clear() 函数(例如:line.clear())清空 line 列表,这样可以重复利用该列表,而无需为每条线创建新的列表。最右侧的 X 标记需要一个自定义函数:

@ @ def middle_custom(): line.append( Insert append ) player.speak("%s flag has been added to the line" % ( insert flag ))

使用两个 @ 符号为函数添加装饰器,然后在 line.append 中填入相应的代码,并在字符串中补充旗帜的颜色。按照路标上的指示完成这一关。

代码书