หลักสูตรการพัฒนาด้วย Python ขั้นสูง
บทที่
>
ระดับ
คลาสขั้นสูง
การโอเวอร์โหลดโอเปอเรเตอร์
วัตถุประสงค์
นับจำนวนไวน์ที่กำลังถูกปรับความใสโดยใช้เวกเตอร์และการโอเวอร์โหลดโอเปอเรเตอร์
หลังจากไวน์ถูกคั้นแล้วจะต้องผ่านการกรองและปรับความใส ซึ่งมีถังมากมายที่กำลังถูกกรองและทั้งหมดจะต้องถูกล้างออก สิ่งสำคัญคือการนับจำนวนไวน์ที่กำลังผลิตเพื่อให้สามารถปิดฝาถังและบ่มไวน์ได้
ในการทำเช่นนี้ คุณจำเป็นต้องสร้างเวกเตอร์และบวกเข้าด้วยกัน โดยเวกเตอร์นี้คล้ายกับรายการ (list) แต่มีความยืดหยุ่นน้อยกว่าแต่มีประสิทธิภาพในการใช้หน่วยความจำมากกว่า โดยปกติแล้วจะใช้สำหรับการจัดการพิกัด ในกรณีนี้เราจะใช้เวกเตอร์เหมือนตัวแปรที่เก็บค่ามากกว่าหนึ่งค่า การบวกเวกเตอร์เข้าด้วยกันทำได้โดยใช้ Operator Overloading ซึ่งช่วยขยายความสามารถของออบเจ็กต์คลาสเพื่อให้สามารถใช้โอเปอเรเตอร์กับพวกมันได้เหมือนกับค่าปกติ
เริ่มต้น ให้เดินและเก็บกระป๋องน้ำโลหะที่อยู่บริเวณบนสุดของห้อง ซึ่งจะใช้ช่วยล้างไวน์ที่กำลังกรองในถัง เมื่อเก็บแล้วให้เดินไปยังเครื่องหมาย X สีเข้มบนพรมสีแดง หันไปที่ถังแล้วเริ่มทำการเวกเตอร์ไนซ์ (vectorize) เนื้อหาของแต่ละถัง
เครื่องหมาย X จะถูกจัดเรียงเป็นชุดละสาม (3) สำหรับแต่ละสีของพรม ได้แก่ เครื่องหมาย X สีทอง, เครื่องหมาย X สีอ่อน และเครื่องหมาย X สีเข้ม สำหรับเครื่องหมาย X สีเข้มและสีอ่อนทั้งหมดให้ใช้ฟังก์ชัน water() เพื่อช่วยล้างถัง และสำหรับเครื่องหมาย X สีเข้มและสีอ่อนทั้งหมด ให้ใช้ฟังก์ชัน read() เพื่อระบุปริมาณไวน์ที่กำลังถูกประมวลผลในคอลัมน์ของถังนั้น สำหรับเครื่องหมาย X สีทองให้ใช้ฟังก์ชัน write() เพื่อจดบันทึกยอดรวมของปริมาณไวน์
ในตัวแก้ไขโค้ดมีคลาสชื่อ vector ซึ่งใช้สำหรับไม่เพียงแต่สร้างเวกเตอร์เท่านั้น แต่ยังสามารถบวกเวกเตอร์เข้าด้วยกันได้ สร้างออบเจ็กต์ vector เพื่อเก็บข้อมูลที่ระบุจากเครื่องหมาย X สีอ่อนและสีเข้ม ตัวอย่างเช่น บนพรมสี red กำลังกรองไวน์แดง:
# Create object using data from dark X mark red_wine_dark = vector(345, 272) # Create object using data from light X mark red_wine_light = vector(248, 432) # Add together vectors for totals red_wine_total = red_wine_dark + red_wine_light
ในเวกเตอร์ ตำแหน่งแรกเรียกว่า x และตำแหน่งที่สองคือ y โดยมีสูตรดังนี้: object_name = vector(x,y) ซึ่งมีความสำคัญสำหรับการนำข้อมูลที่ได้จากฟังก์ชัน read() ไปใส่ในเวกเตอร์
บนเครื่องหมาย X สีทองให้ใช้ฟังก์ชัน write() เพื่อจดจำนวนรวมของแต่ละชุดเวกเตอร์ ตัวอย่างเช่น ในกรณีของเครื่องหมาย X บนพรมสีแดงจะเขียนดังนี้:
await player.write( "There is a total of %s pounds on the left barrels and %s pounds on the right barrels" % (red_wine_total.x, red_wine_total.y)
อย่าลืมเพิ่ม .x และ .y ต่อท้ายยอดรวมเพื่อระบุค่าของแต่ละเวกเตอร์
สำหรับแต่ละชุดของพรมสีจะมีประเภทของไวน์ที่ถูกกรองแตกต่างกัน บนพรม red ไวน์แดงจะถูกกรอง; บนพรม yellow จะถูกกรองเป็น sparkling_wine; บนพรม green จะถูกกรองเป็น white_wine; และบนพรม orange กำลังกรองเป็น orange_wine
เมื่อทุกเครื่องหมาย X สีเข้มและสีอ่อนถูกล้างด้วยฟังก์ชัน water() และทุกเครื่องหมาย X สีทองมีการจดบันทึกยอดรวมแล้ว คุณก็จะผ่านด่านนี้แล้ว