Showing posts with label OOP. Show all posts
Showing posts with label OOP. Show all posts

Sunday, 15 July 2012

Python - Inheritance


ม้า Pegasus ในตำนานของเทพนิยายกรีก

จากภาพม้า Pegasus ในรูป เราจะเห็นว่า ม้า Pegasus ไม่ใช่ม้าธรรมดา แต่เป็นม้าพิเศษที่บินได้ สำหรับในแง่ของ OOP เราจะมองว่าม้า Pegasus inherit มาจาก "ม้า" และเพิ่มความสามารถในการ "บิน" เข้าไป เดี๋ยวเราจะมาลองสร้างม้า Pegasus แบบ OOP ในภาษา Python ดูนะครับ


จากตัวอย่างข้างต้น class ที่ชื่อว่า Pegasus จะ inherit มาจาก class ที่ชื่อว่า Horse ทำให้ Pegasus จะได้รับคุณสมบัติจาก Horse ซึ่งในที่นี้ก็คือ method ที่ชื่อว่า run() นอกจากนั้นใน class Pegasus ยังเพิ่มความสามารถ โดยการเพิ่ม method ที่ชื่อว่า fly() เข้าไป ทำให้ Pegasus สามารถเรียกใช้ run() และ fly() ได้

Python - Using Class



Class เป็น Data Structure ประเภทหนึ่ง ซึ่งภายในอาจจะมี Procedure (บางครั้งเรียกว่า Method) และ Data (บางครั้งเรียกว่า Attribute) อยู่ภายใน ปกติเราจะใช้งาน Class เพื่อซ่อนการใช้งานในส่วนที่ซับซ้อนไว้ภายใน โดยจะ provide เฉพาะ methods หรือ attributes ส่วนที่จำเป็นต่อการใช้งานออกสู่ภายนอก สำหรับการใช้งาน Class ใน Python จะสามารถทำได้ดังตัวอย่างต่อไปนี้


สังเกตุว่า Constructor ใน Python จะใช้ method ที่มีชื่อว่า __init__ และทุกๆ method ใน Class เราจะต้องส่ง self เป็น parameter ตัวแรกเสมอ ซึ่งทำให้รู้สึกแปลกๆเหมือนกัน เพราะในภาษาอื่นๆ (เท่าที่เคยใช้มา) เราไม่จำเป็นต้องส่งเข้าไปเอง ยกตัวอย่างอย่างเช่นในภาษา Java เราจะสามารถใช้งาน this ได้เลย ซึ่งในกรณีนี้น่าเป็นเพราะว่า Python ต้องการให้มีความชัดเจนว่าตัวแปรที่นำมาใช้ มีที่มาที่ไปยังไง ตามหลักการที่ว่า explicit is better than implicit (แต่สุดท้ายก็ยังขัดๆอยู่ดี)