高级 Python 开发课程
第 章
>
第 级
装饰器
优化装饰器
目标
使用装饰器收集配料并制作不同种类的披萨。
现在烤箱已经设置好,是时候准备一些披萨以便稍后烹饪了。既然我们已经了解如何使用装饰器,就可以对其进行一些优化。通过在代码中使用 @ 符号,后跟装饰器的名称,并将该代码放在被装饰函数的上方,我们就可以在不使用变量的情况下自动附加装饰器。例如:
# Decorator
def create_pizza(func):
def set():
pizza = ["dough","red sauce","cheese"]
player.combine(pizza)
func()
return set
# Function being decorated with @
@create_pizza
def peperoni_pizza():
player.place("Peperoni")
player.speak("Peperoni Pizza has been prepped")
# Using pre-decorated function
peperoni_pizza()
值得注意的是,这种技术通过在使用前预先装饰函数简化了流程,不过有时你可能仍希望将装饰器赋值给一个变量以获得更大的灵活性。
首先,走向金色的 X 标记并获取制作披萨的配料。制作披萨的配料包括:"cheese"、"dough"、"red sauce"、"peperoni"、"ham"、"olive"、"pepper"、"onion" 和 "pineapple"。这些大部分配料存放在一个表示储藏室货架的矩阵中,请使用列表推导式将你希望获取的所有物品存储到一个列表中。
shelves = [ ["cheese", "dough", "jar"], ["jar", "red sauce", "jar"], ["peperoni", "jar" , "ham"], ["olive", "pepper", "onions"] ] ingredients = [ item for row in shelves for item in row if not "jar" in item]
在上述代码中,列表 ingredients 遍历名为 shelves 的矩阵中的每一行,并移除了所有名为 "jar" 的项。这个列表推导式帮我们省去了手动逐个添加所有物品的麻烦。使用 speak() 函数和这个配料列表来确认你将要使用的物品。
一旦除了 "pineapple" 之外的所有配料都已收集完毕,为了完整实现制作披萨的功能,需要为这些函数增加 place() 函数。这些函数已在代码编辑器中设置好,分别命名为:peperoni_pizza()(需要 "peperoni")、vegetable_pizza()(需要 "olive"、"pepper"、"onion")以及 pineapple_pizza()(需要 "ham" 和 "pineapple")。
走向黑色的 X 标记,并使用装饰过的函数来制作披萨。在带有红色地毯的 X 标记处制作 peperoni_pizza(),在绿色地毯处制作 vegetable_pizza(),在黄色地毯处制作 pineapple_pizza()。在前往黄色地毯的路上,停在浅色地毯的 X 标记处,面向橱柜并使用 collect() 函数获取 "pineapple"。准备所有披萨以成功完成这一关。