ปฏิบัติการเกี่ยวกับวิศวกรรมคอมพิวเตอร์ (01204223) แนะนำ OOP แบบเต่า ๆ ปฏิบัติการเกี่ยวกับวิศวกรรมคอมพิวเตอร์ (01204223) ผศ.ดร.ชัยพร ใจแก้ว ภาควิชาวิศวกรรมคอมพิวเตอร์ คณะวิศวกรรมศาสตร์ มหาวิทยาลัยเกษตรศาสตร์
คลาสและอ็อปเจ็กต์ คลาส อธิบายชนิดของอ็อปเจ็กต์ว่ามีคุณสมบัติและทำอะไรเป็นบ้าง คุณสมบัติ attribute หรือ property ทำอะไรเป็นบ้าง method circle1 color = Yellow radius = 1 create circle2 color = Red radius = 1.5 create อ็อปเจ็กต์ ชนิด Circle คลาส Circle มีคุณสมบัติ: radius, color create circle3 color = Blue radius = 2
สร้างอ็อปเจ็กต์เต่า เรียกใช้งานมอดูล turtle หมายเหตุ: เราลากทุกอย่างใน turtle มาไว้ใน global namespace เพื่อความสะดวก สร้างอ็อปเจ็กต์เต่าจากคลาส Turtle ขึ้นมา 2 ตัว อ้างอิงผ่านตัวแปร t1 และ t2 ศัพท์ OOP เรียกว่าเป็นการทำ object instantiation อ็อบเจ็กต์อาจถูกเรียกว่าเป็น instance ของคลาสนั้น ๆ >>> from turtle import * >>> t1 = Turtle() >>> t2 = Turtle()
สั่งเต่าเคลื่อนที่ เต่าทุกตัวรู้จักคำสั่งเบื้องต้นดังนี้ t.forward(d) - สั่ง t เดินหน้าเป็นระยะทาง d t.backward(d) - สั่ง t ถอยหลังเป็นระยะทาง d t.right(a) - สั่ง t หันขวาเป็นมุม a องศา t.left(a) - สั่ง t หันซ้ายเป็นมุม a องศา t.penup() - สั่ง t ยกปากกา t.pendown() - สั่ง t วางปากกา
เมท็อดในไพธอน พิจารณาเมท็อด forward ที่นิยามไว้ในคลาส Turtle เห็นได้ว่าคลาส Turtle เป็นเสมือนเนมสเปสที่บรรจุฟังก์ชัน forward เอาไว้ โดยฟังก์ชัน forward รับพารามิเตอร์ 2 ตัวคือ self และ distance เรียกใช้งานได้สองแบบ >>> help(Turtle.forward) Help on method forward in module turtle: forward(self, distance) unbound turtle.Turtle method Move the turtle forward by the specified distance. >>> Turtle.forward(t1, 50) นิยมใช้มากกว่า >>> t1.forward(50)
กำหนดสีให้เต่า อ็อปเจ็กต์เต่าทุกตัวมี "สี" เป็นหนึ่งในคุณสมบัติ ตรวจสอบและตั้งค่าได้ผ่านเมท็อด color() หมายเหตุ: คุณสมบัติสีมีองค์ประกอบสองส่วนคือ "สีปากกา" และ "สีระบาย" จึงเห็นว่าเป็น 2-tuple >>> t1.color() ('black','black') >>> t1.color('red') >>> t2.color('blue') ('red','red') >>> t2.color() ('blue','blue')
สร้างเต่าพันธุ์ใหม่ สร้างคลาสใหม่ชื่อ XTurtle โดยดัดแปลงจากคลาสเดิม ใช้เอดิเตอร์สร้างไฟล์ xturtle.py ที่บรรจุโค้ด ศัพท์ OOP เรียกว่าเป็นการทำ inheritance XTurtle เป็น "ซับคลาส" ของ Turtle Turtle เป็น "ซูเปอร์คลาส" ของ XTurtle from turtle import * class XTurtle(Turtle): def square(self, size): for i in range(4): self.forward(size) self.right(90)
ทดสอบคลาส XTurtle โหลดมอดูล xturtle ด้วยคำสั่ง import หรือ โหลดมอดูล xturtle ด้วยคำสั่ง from-import คลาส XTurtle ปรากฏใน global namespace หรือ เรียกไฟล์ xturtle.py แบบ interactive ด้วยทางเลือก -i $ python >>> import xturtle >>> t = xturtle.XTurtle() >>> t.square(20) $ python >>> from xturtle import XTurtle >>> t = XTurtle() >>> t.square(20) $ python –i xturtle.py >>> t = XTurtle() >>> t.square(20)
เรียกเมท็อด forward ของคลาส Turtle เดิม โอเวอร์ไรด์เมท็อด เมท็อดในซูเปอร์คลาสถูกนิยามทับได้ เรียกว่าเป็นการทำ method overriding ตัวอย่างด้านล่างทำให้เต่าสายพันธุ์ XTurtle เดินไกลเป็นสองเท่าเมื่อใช้เมท็อด forward class XTurtle(Turtle): : def forward(self, distance): Turtle.forward(self, distance*2) เรียกเมท็อด forward ของคลาส Turtle เดิม
คอนสตรัคเตอร์ (Constructor) คอนสตรัตเตอร์ เป็นเมท็อดพิเศษที่ถูกเรียกเมื่อ อ็อปเจ็กต์ของคลาสกำลังถูกสร้างขึ้น เมท็อตชื่อ __init__ นิยามเป็นพื้นฐานไว้ในทุกคลาสอยู่แล้ว โอเวอร์ไรด์ได้เพื่อควบคุมกระบวนการสร้าง ตัวอย่าง: กำหนดให้เต่าสายพันธุ์ XTurtle ทุกตัวมีสีน้ำเงินทันทีที่เกิดขึ้นมา class XTurtle(Turtle): def __init__(self): Turtle.__init__(self) self.color('blue')
ส่งพารามิเตอร์ให้คอนสตรัคเตอร์ พารามิเตอร์ที่ระบุขณะสร้างอ็อบเจ็กต์จะถูกส่งไปให้ __init__ ตัวอย่าง: ทำให้คลาส XTurtle รับตัวคูณของระยะการเดิน รวมถึงพารามิเตอร์ทั้งหมดของคลาส Turtle เดิมได้ ทดสอบ class XTurtle(Turtle): def __init__(self, factor=1.0, *args, **kwargs): Turtle.__init__(self, *args, **kwargs) self._factor = factor def forward(self, distance): Turtle.forward(self, distance*self._factor) ให้ _factor เป็นแอตริบิวต์ (attribute) ของอ็อบเจ็กต์ >>> from xturtle import XTurtle >>> t1 = XTurtle(factor=2.0, shape='turtle') >>> t2 = XTurtle() >>> t1.forward(100) >>> t2.forward(100)
แบบฝึกหัด สร้างมอดูล chasingturtle.py บรรจุคลาสชื่อ ChasingTurtle ที่สืบสายพันธุ์จาก Turtle โดยรองรับเมท็อดและแอตริบิวต์ดังนี้ เมท็อด chase - สั่งให้เต่าวิ่งสู่เป้าหมายตามจำนวนก้าวที่กำหนด (ถ้าเป้าหมายเป็น None ให้อยู่เฉย ๆ) โดยรับพารามิเตอร์เป็น steps ระบุจำนวนก้าวที่วิ่งสู่เป้าหมาย คอนสตรัคเตอร์ รับพารามิเตอร์ของคลาส Turtle เดิมได้ทั้งหมด รวมถึงอีกสองพารามิเตอร์เพิ่มเติมคือ target ระบุเต่าเป้าหมาย (ดีฟอลท์เป็น None) color ระบุสีเต่าตอนเกิด (ดีฟอลท์เป็น 'black') แอตริบิวต์ target เก็บเป้าหมายปัจจุบัน คำใบ้: ศึกษาเมท็อด Turtle.towards และ Turtle.setheading
ทดสอบแบบฝึกหัด รันโปรแกรมต่อไปนี้เพื่อทดสอบความถูกต้อง from chasingturtle import Turtle, ChasingTurtle leader1 = Turtle() leader2 = Turtle() leader1.penup(); leader1.setpos(-100,-200); leader1.setheading(180) leader2.penup(); leader2.setpos(100,200); leader2.setheading(0) chaser = ChasingTurtle(color='red', target=leader1, shape='turtle') for i in range(100): leader1.forward(1) leader2.forward(1) chaser.chase(2) chaser.target = leader2 raw_input()