高级 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 中填入相应的代码,并在字符串中补充旗帜的颜色。按照路标上的指示完成这一关。