หลักสูตรการพัฒนาด้วย Python ขั้นสูง
บทที่
>
ระดับ
ตัวตกแต่ง
การเพิ่มประสิทธิภาพของ Decorators
วัตถุประสงค์
รวบรวมส่วนผสมและเตรียมพิซซ่าหลากประเภทโดยใช้ decorators.
ตอนนี้เตาอบได้ถูกตั้งค่าแล้ว ถึงเวลาที่จะเตรียมพิซซ่าเพื่อให้เราสามารถทำอาหารต่อไปได้ หลังจากที่เรารู้วิธีใช้ decorators เราสามารถปรับปรุงให้มีประสิทธิภาพมากขึ้นได้ ด้วยการใช้สัญลักษณ์ @ ในโค้ดตามด้วยชื่อของ decorator และวางโค้ดนี้ไว้เหนือฟังก์ชันที่ต้องตกแต่ง เราสามารถแนบ decorator โดยอัตโนมัติโดยไม่ต้องใช้ตัวแปร ตัวอย่างเช่น:
# 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()
ต้องสังเกตว่า เทคนิคนี้ช่วยให้งานง่ายขึ้นด้วยการที่ฟังก์ชันถูกตกแต่งไว้ล่วงหน้าก่อนใช้งาน แต่บางครั้งคุณอาจยังคงต้องการกำหนด decorator ให้กับตัวแปรเพื่อความยืดหยุ่นที่มากขึ้น
เริ่มต้นด้วยการเดินไปยังเครื่องหมาย X สีทองและหยิบส่วนผสมสำหรับทำพิซซ่า ส่วนผสมสำหรับทำพิซซ่าคือ: "cheese", "dough", "red sauce", "peperoni", "ham", "olive", "pepper", "onion" และ "pineapple". ส่วนใหญ่ของส่วนผสมเหล่านี้อยู่ภายใน Matrix ที่แทนชั้นวางของใช้ในครัว ใช้ List Comprehensions ในการจัดเก็บรายการของรายการที่คุณต้องการหยิบไว้ในลิสต์
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 วนซ้ำผ่านแถวต่าง ๆ ของ Matrix ชื่อ shelves และลบรายการทั้งหมดที่เป็น "jar" ออกไป List Comprehension นี้ช่วยประหยัดเวลาในการรวมทุกสิ่งทุกอย่างด้วยตนเอง ใช้ฟังก์ชัน 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" เตรียมพิซซ่าทั้งหมดเพื่อที่จะผ่านด่านนี้ไปอย่างสำเร็จ