หลักสูตรการพัฒนาด้วย Python ขั้นสูง
บทที่
>
ระดับ
ตัวตกแต่ง
การเชื่อมต่อ Decorators
วัตถุประสงค์
ตกแต่งหลังคาด้วยธงที่มีสีโดยเชนตัวตกแต่ง
หลังคาได้สัมผัสกับลมบริสุทธิ์หลังจากที่ถูกกักอยู่ในครัวมานาน บางบรรทัดยังไม่มีธง การตั้งธงในตอนนี้อาจเป็นความคิดที่ดี แต่มันอาจจะซับซ้อนเนื่องจากคุณต้องใช้ธงหลากหลายแบบสำหรับแต่ละบรรทัด คุณสามารถทำสิ่งนี้ได้โดยการเชนตัวตกแต่ง
ตัวตกแต่งสามารถเชนกันได้โดยการเพิ่มสัญลักษณ์ @ ซ้ำ ซึ่งหมายถึงการแนบตัวตกแต่งหลายตัวเข้ากับฟังก์ชันเดียวกัน ตัวอย่างเช่น วิธีนี้ช่วยให้คุณสามารถแทรกฟังก์ชันหนึ่งไว้ระหว่างฟังก์ชันตัวตกแต่งสองตัวได้:
# 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() เพื่อตรวจสอบคำแนะนำที่ระบุไว้บนป้าย ที่นี่จะแจ้งให้คุณทราบว่าจะวางธงใดไว้ที่ไหน โดยมีธงที่มีสีแตกต่างกันสามชนิด: "red" , "green" และ "blue" แต่ละบรรทัดจะมีธงทั้งสามชนิด หนึ่งอันอยู่ตรงกลาง บรรทัดชั้นในมีสองอัน และบรรทัดชั้นนอกมีสองอัน รวมเป็นทั้งหมดห้าอันต่อบรรทัด เหมือนกับบรรทัดที่สร้างไว้ล่วงหน้าในมุมซ้ายล่างของแผนที่
เดินไปยังเครื่องหมาย X สีอ่อนและใช้ฟังก์ชัน collect() เพื่อเก็บ "flags" จากกล่อง จากนั้นเดินไปยังเครื่องหมาย 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 ))
ใช้สัญลักษณ์ @ สองตัวที่ตั้งไว้เพื่อเพิ่มตัวตกแต่งให้กับฟังก์ชัน จากนั้นเติมข้อมูลในส่วนของการเพิ่มธงลงในลิสต์และระบุสีของธงในสตริง ทำเช่นนี้ตามคำแนะนำในป้ายเพื่อทำให้ระดับนี้สมบูรณ์