Object-Oriented Programming (OOP)

ความหมายของ OOP (Object-Oriented Programming)

OOP (Object-Oriented Programming) หมายถึงการเขียนโปรแกรมเชิงวัตถุหรือเขียนโปรแกรมแบบออบเจ็กต์ ซึ่งมีวิธีการของการจัดโครงสร้างโปรแกรมเพื่อให้คุณสมบัติและพฤติกรรมหรือการกระทำรวมอยู่ในแต่ละวัตถุ [Lut11] ตัวอย่างเช่น วัตถุอาจเป็นตัวแทนของบุคคลที่มีคุณสมบัติ คือ ชื่อ นามสกุล อายุ ที่อยู่ และมีพฤติกรรม เช่น การเดิน การพูด การหายใจ และการวิ่ง เป็นต้น

คลาส (Classes) และ ออบเจ็กต์ (Objects)

คลาส (Classes) เปรียบเสมือนแบบพิมพ์เขียวหรือแม่พิมพ์ที่ใช้สร้างออบเจ็กต์ (Objects) ในคลาสจะกำหนดรูปแบบของข้อมูลหรือแอตทริบิวต์หรือตัวแปร (Attributes/Properties/Characteristics) และเมธอด (Methods/Behaviors) ตัวอย่างเช่น คลาสชื่อ Pet มีแอตทริบิวต์คือ legs ส่วน wolf คือ ออบเจ็กต์ที่สร้างขึ้น มาจากคลาส ดังตัวอย่างต่อไปนี้

คลาสและออบเจ็กต์
class Pet: # define a class pet
   legs = 0  # a property for the class
   wolf = Pet() # create an object of the class
   wolf.legs # access to a property of the object

การสร้างคลาส

การสร้างคลาสในภาษา Python ต้องใช้คำสั่ง class ตามด้วยชื่อคลาส ดังตัวอย่างต่อไปนี้

การสร้างคลาส
class Pet: #define a class pet
   legs = 0 #a property for the class

การสร้างออบเจ็กต์

หลังจากที่สร้างคลาสแล้ว ก็จะสามารถสร้างตัวแปรออบเจ็กต์จากคลาสได้ เช่น wolf = Pet() โดยออบเจ็กต์นี้จะมีแอตทริบิวต์คือ legs และสามารถเข้าถึงแอตทริบิวต์ของออบเจ็กต์ได้โดยใช้เครื่องหมายจุด (.) ดังตัวอย่างต่อไปนี้

การสร้างออบเจ็กต์
wolf = Pet() # create an object of the class
print(wolf.legs) # access to a property of the object

ฟังก์ชัน __init__()

ฟังก์ชัน __init__() เรียกว่าเป็นคอนสตรัคเตอร์ (Constructor) ซึ่งถูกเรียกใช้อัตโนมัติทุกครั้ง ในการกำหนดค่าให้แก่แอตทริบิวต์ของออบเจ็กต์และการดำเนินการต่างๆที่จำเป็นเมื่อต้องสร้างออบเจ็กต์ขึ้นมา และสำหรับพารามิเตอร์ self มีไว้เพื่อการเข้าถึงตัวแปรต่างๆ ที่เป็นของคลาส โดยที่ไม่จำเป็นต้องใช้คำว่า self ก็ได้ สามารถตั้งเป็นคำอื่นได้ ดังตัวอย่างต่อไปนี้

__init__() Function
class Person:
   name = None
   gender = None

   #Define the constructor
   def __init__(self, n, g):
      self.name = n
      self.gender = g
#Main code starts here
p1 = Person('Mike', 'male') # create object p1
p2 = Person('Jan', 'female') # create object p2

การสร้างเมธอดของออบเจ็กต์

เมธอดในออบเจ็กต์ก็คือฟังก์ชันที่เป็นของออบเจ็กต์นั้น ในตัวอย่างเป็นการสร้างเมธอด foo เพื่อทำการ print คำว่า Hello แล้วตามด้วยชื่อ เมื่อออบเจ็กต์จะเรียกใช้เมธอดก็ให้เขียนชื่อออบเจ็กต์นั้นตามด้วยจุดแล้ว จึงตามด้วยชื่อเมธอด ดังตัวอย่างต่อไปนี้

ตัวอย่างการสร้างเมธอดของออบเจ็กต์
class Person:
   name = None
   gender = None
   def __init__(self, n, g):
      self.name = n
      self.gender = g
   def foo(self):
      print('Hello' , self.name)

#Main code starts here
p1 = Person('Mike', 'male')
p2 = Person('Jan', 'female')
p1.foo()
p2.foo()

ซึ่งได้ผลลัพธ์ดังนี้

ผลลัพธ์จากตัวอย่างการสร้างเมธอดของออบเจ็กต์
Hello Mike Hello Jan

การแก้ไขค่าของแอตทริบิวต์ของออบเจ็กต์

การแก้ไขค่าของแอตทริบิวต์ของออบเจ็กต์สามารถทำได้เหมือนการกำหนดค่าของตัวแปร ดังตัวอย่างต่อไปนี้

ตัวอย่างการแก้ไขค่าของแอตทริบิวต์ของออบเจ็กต์
>>> p1.name = 'Ton-mike'
>>> p1.foo()
Hello Ton-mike

การลบแอตทริบิวต์ของออบเจ็กต์

การลบแอตทริบิวต์ของออบเจ็กต์ให้ใช้คำสั่ง del ตามด้วยแอตทริบิวต์ของออบเจ็กต์นั้น ดังตัวอย่างต่อไปนี้

ตัวอย่างการลบแอตทริบิวต์ของออบเจ็กต์
>>> del p1.name
>>> p1.foo()
Hello None

การลบออบเจ็กต์

การลบออบเจ็กต์ทำได้โดยใช้คำสั่ง del ตามด้วยชื่อของออบเจ็กต์ได้เลย ดังตัวอย่างต่อไปนี้

ตัวอย่างการลบออบเจ็กต
>>> del p1
>>> p1
Traceback (most recent call last):
File "<pyshell\#29>", line 1, in <module>
   p1
NameError: name 'p1' is not defined

การสืบทอดคลาส (Class Inheritance)

การสืบทอดคลาส (Class Inheritance) คือการที่คลาสหนึ่งสามารถสืบทอดเมธอดและแอตทริบิวต์ ของคลาสนั้นไปยังคลาสอื่นได้ เรียกคลาสที่เป็นฐานหรือให้การสืบทอดนั้นว่าคลาสแม่ (Parent class) และ เรียกคลาสที่ได้รับการสืบทอด ว่าคลาสลูก (Child class) ตัวอย่าง คลาสแม่คือ SchoolMember ได้มีการ สืบทอดเมธอดและ แอตทริบิวต์ ไปยังคลาสลูกคือคลาส Teacher หลังจากนั้นคลาสลูกก็จะสามารถใช้เมธอด และแอตทริบิวต์ของคลาสแม่ได้ ดังตัวอย่างต่อไปนี้

ตัวอย่างการสืบทอดคลาส
#Define the class Teacher. It inherits from class SchoolMember
class Teacher(SchoolMember):
   def __init__(self, name, age, salary):
      SchoolMember.__init__(self, name, age)
      self.salary = salary

#Main code
teacher1 = Teacher('Mr. Mike Piyawat', 47, 50000)
teacher2 = Teacher('Mrs. Jane Doe', 55, 120000)

print(teacher1.name)
print(teacher1.age)
print(teacher1.salary)
print('\n')
print(teacher2.name)
print(teacher2.age)
print(teacher2.salary)

ซึ่งได้ผลลัพธ์ดังนี้

ผลลัพธ์จากตัวอย่างการสืบทอดคลาส
Mr. Mike Piyawat
47
50000


Mrs. Jane Doe
55
120000

แบบฝึกหัด

  1. เขียนคลาสชื่อว่า Pet ประกอบด้วย

    • คอนสตรัคเตอร์ (Constructor)

    • แอตทริบิวต์ genre

    • แอตทริบิวต์ legs

    • เมธอด start_running แสดงผลทางหน้าจอว่า “Start running”

    • เมธอด stop_running แสดงผลทางหน้าจอว่า “Stop running”

  2. จากข้อ 1 ให้เขียนโปรแกรมเพื่อสร้างออบเจ็กต์จากคลาส Pet สองออบเจ็กต์ แล้วเรียกใช้เมธอดที่มี