02/11/2026 09:58น.

Object-Oriented Programming (OOP) คืออะไร มีหลักการอะไรบ้าง
#Object-Oriented Programming
#OOP คืออะไร
#หลักการ OOP
#Class และ Object
#Encapsulation OOP
#Polymorphism OOP
#OOP Python
ถ้าลองถามนักพัฒนาสองคนว่า OOP ยังจำเป็นไหม มีโอกาสสูงที่จะได้คำตอบคนละทาง ฝั่งหนึ่งบอกว่า OOP คือพื้นฐานที่นักพัฒนาทุกคนต้องแม่น เพราะภาษายอดนิยมอย่าง Java, C# หรือ Python ล้วนมี Class ให้ใช้ อีกฝั่งบอกว่า OOP เป็นแนวคิดที่เริ่มล้าสมัยแล้ว เขียนเป็น Function ธรรมดาก็พอ ทั้งสองฝั่งต่างก็เป็นข้ออ้าง ยังไม่ใช่ข้อเท็จจริง และมือใหม่ที่ได้ยินทั้งสองเสียงพร้อมกันก็มักจะสับสนว่าควรเริ่มเรียนตรงไหน
สั้นๆ: OOP (Object-Oriented Programming) คือวิธีเขียนโปรแกรมที่จัดข้อมูลกับการทำงานที่เกี่ยวข้องกันไว้ด้วยกันเป็นก้อนที่เรียกว่า Object โดยมี Class เป็นแม่พิมพ์ที่ใช้สร้าง Object
วันนี้ Superdev Academy จะพาไปดูว่า Class กับ Object ต่างกันอย่างไร หลักการ OOP ทั้ง 4 ข้อหน้าตาเป็นอย่างไรในโค้ดจริง ข้อดีและข้อจำกัดของมัน แล้วค่อยกลับมาตอบว่าข้ออ้างของสองฝั่งนั้น ฝั่งไหนถูกแค่ไหน ตัวอย่างทุกชิ้นในบทความนี้เป็น Python 3 ที่ทีมเรารันจริงด้วย Python 3.14.6 เมื่อวันที่ 1 ตุลาคม 2026 พร้อมผลลัพธ์ที่ได้
Object-Oriented Programming (OOP) คืออะไร
OOP คือรูปแบบการเขียนโปรแกรม (Programming Paradigm) แบบหนึ่ง ที่มองโปรแกรมเป็นกลุ่มของ Object ซึ่งแต่ละตัวมีทั้งข้อมูลของตัวเอง เรียกว่า Attribute และมีการทำงานที่ใช้กับข้อมูลนั้น เรียกว่า Method (ฟังก์ชันที่อยู่ใน Class)
เอกสาร Python Tutorial หัวข้อ Classes อธิบายไว้ว่า Class เป็นวิธีมัดข้อมูลกับการทำงานเข้าไว้ด้วยกัน และการสร้าง Class ใหม่ก็คือการสร้างชนิดของ Object ชนิดใหม่ ที่เอาไปสร้างตัวจริง (Instance) ได้กี่ตัวก็ได้ พูดง่ายๆ คือแทนที่จะมีตัวแปรกระจายอยู่ทั่วไฟล์ แล้วมีฟังก์ชันอีกชุดคอยไล่แก้ตัวแปรพวกนั้น OOP ให้เราเก็บของที่เกี่ยวกันไว้ในกล่องเดียว
ภาษาที่รองรับ OOP มีหลายภาษา ทั้ง Java, C#, C++, Python และ JavaScript แต่แต่ละภาษาทำไม่เหมือนกันทั้งหมด เช่น MDN อธิบายว่าใน JavaScript เราสร้าง Object ได้บ่อยๆ โดยไม่ต้องมี Class เลย และกลไกเบื้องหลังที่เรียกว่า Prototype ทำงานคล้ายการส่งต่องาน (Delegation) มากกว่าการสืบทอดแบบภาษาอื่น
Class กับ Object ใน OOP คืออะไร ต่างกันอย่างไร
ลองนึกภาพพิมพ์กดคุกกี้หนึ่งอัน กับคุกกี้หลายชิ้นบนถาดอบ พิมพ์กดคือ Class มันกำหนดว่าคุกกี้ทุกชิ้นจะมีรูปร่างแบบไหน แต่ตัวมันเองกินไม่ได้ ส่วนคุกกี้แต่ละชิ้นคือ Object เป็นของจริงที่สร้างจาก Class ใช้พิมพ์อันเดียวกัน แต่แต่ละชิ้นจะโรยหน้าคนละรสก็ได้
class Cookie:
def __init__(self, flavor):
self.flavor = flavor
def describe(self):
return f"คุกกี้รส{self.flavor}"
a = Cookie("ช็อกโกแลต")
b = Cookie("เนย")
print(a.describe())
print(b.describe())
print(type(a).__name__, a is b)ผลลัพธ์ที่ได้จากการรัน
คุกกี้รสช็อกโกแลต
คุกกี้รสเนย
Cookie Falseอ่านโค้ดทีละส่วน
class Cookie: คือการประกาศ Class หรือแม่พิมพ์ ยังไม่มีคุกกี้เกิดขึ้นจริงในบรรทัดนี้
__init__: คือ Constructor (ฟังก์ชันที่ทำงานตอนสร้าง Object) ใช้ตั้งค่าเริ่มต้นให้แต่ละชิ้น
self.flavor: คือ Attribute ที่แต่ละ Object เก็บเป็นของตัวเอง
Cookie("ช็อกโกแลต"): คือการสร้าง Object จริงหนึ่งชิ้น
บรรทัดสุดท้ายยืนยันสองเรื่อง ทั้งสองชิ้นเป็นชนิด Cookie เหมือนกัน แต่ a is b ได้ False แปลว่าเป็นคนละ Object กัน ข้อมูลข้างในจึงแยกจากกันจริง
Class คือแบบที่บอกว่าของจะหน้าตาอย่างไร Object คือของที่ถูกสร้างออกมาจากแบบนั้น
หลักการ OOP มีอะไรบ้าง: 4 หลักการสำคัญพร้อมตัวอย่าง
หลักการสำคัญที่มักถูกยกเป็นแกนของ OOP มี 4 ข้อ คือ Encapsulation, Inheritance, Polymorphism และ Abstraction แต่ละข้อแก้ปัญหาคนละแบบ เราจะดูทีละข้อพร้อมโค้ดสั้นๆ ที่รันได้จริง
Encapsulation คืออะไร
MDN นิยาม Encapsulation ว่าเป็นการเก็บสถานะภายในของ Object ไว้เป็นส่วนตัว และแบ่งให้ชัดว่าส่วนไหนคือ Interface สาธารณะที่คนอื่นเรียกใช้ได้ ส่วนไหนคือไส้ในที่ไม่ควรแตะ
class BankAccount:
def __init__(self):
self._balance = 0
def deposit(self, amount):
if amount <= 0:
raise ValueError("amount must be positive")
self._balance += amount
@property
def balance(self):
return self._balance
acc = BankAccount()
acc.deposit(500)
print(acc.balance)
try:
acc.deposit(-100)
except ValueError as e:
print("ValueError:", e)
print(acc.balance)500
ValueError: amount must be positive
500ยอดเงินถูกเปลี่ยนได้ทางเดียวคือผ่าน deposit() ซึ่งมีด่านตรวจว่าจำนวนต้องเป็นบวก ยอดติดลบจึงหลุดเข้ามาไม่ได้ จุดที่ควรรู้คือ Python ไม่ได้บังคับเรื่องนี้แบบเด็ดขาด เอกสาร Python เขียนไว้ตรงๆ ว่าตัวแปรที่เข้าถึงจากนอก Object ไม่ได้เลยนั้นไม่มีอยู่จริงใน Python ขีดล่างหน้าชื่ออย่าง _balance เป็นแค่ข้อตกลงร่วมกันว่า "อย่าแตะ" ส่วนภาษาอย่าง Java มีคำว่า private ที่บังคับระดับภาษา
Inheritance คืออะไร
Inheritance (การสืบทอด) คือการสร้าง Class ใหม่ต่อยอดจาก Class เดิม Class ลูกได้ Attribute และ Method ของ Class แม่ไปใช้ทันที แล้วเพิ่มของตัวเองเข้าไปได้
class Animal:
def __init__(self, name):
self.name = name
def eat(self):
return f"{self.name} is eating"
class Dog(Animal):
def bark(self):
return f"{self.name}: Woof!"
d = Dog("Lucky")
print(d.eat())
print(d.bark())
print(isinstance(d, Animal))Lucky is eating
Lucky: Woof!
TrueDog ไม่ได้เขียน eat() เองเลย แต่เรียกใช้ได้เพราะสืบทอดมาจาก Animal และ isinstance(d, Animal) ได้ True แปลว่าในสายตาของโปรแกรม หมาตัวนี้ก็นับเป็นสัตว์ด้วย
Polymorphism คืออะไร
MDN อธิบาย Polymorphism ว่าคือการที่ Method ชื่อเดียวกันมีการทำงานต่างกันใน Class ที่ต่างกัน ข้อดีคือโค้ดที่เรียกใช้ไม่ต้องรู้ว่ากำลังคุยกับ Object ชนิดไหน
class Dog:
def speak(self):
return "Woof"
class Cat:
def speak(self):
return "Meow"
for pet in [Dog(), Cat()]:
print(type(pet).__name__, pet.speak())Dog Woof
Cat Meowลูป for เรียก speak() แบบเดียวกันทุกรอบ ถ้าวันหน้าเพิ่ม Class ใหม่อย่าง Bird ที่มี speak() ลูปนี้ก็ใช้ได้ทันทีโดยไม่ต้องแก้สักบรรทัด สังเกตว่าตัวอย่างนี้ไม่ได้ใช้ Inheritance เลย ใน Python แค่มี Method ชื่อตรงกันก็พอ
Abstraction คืออะไร
Abstraction คือการซ่อนรายละเอียดที่ผู้ใช้ไม่จำเป็นต้องรู้ แล้วเปิดให้เห็นแค่ว่าของชิ้นนี้ "ทำอะไรได้" เหมือนพวงมาลัยรถที่ให้เราเลี้ยวได้โดยไม่ต้องรู้ว่าระบบบังคับเลี้ยวข้างใต้ทำงานอย่างไร ใน Python ทำได้ด้วยโมดูล abc ซึ่งเอกสารระบุว่า Class ที่ยังมี Abstract Method ค้างอยู่จะสร้าง Object ไม่ได้ จนกว่า Class ลูกจะเขียน Method เหล่านั้นให้ครบ
from abc import ABC, abstractmethod
class Shape(ABC):
@abstractmethod
def area(self):
...
class Square(Shape):
def __init__(self, side):
self.side = side
def area(self):
return self.side * self.side
print(Square(3).area())
try:
Shape()
except TypeError as e:
print("TypeError:", e)9
TypeError: Can't instantiate abstract class Shape without an implementation for abstract method 'area'Shape บอกแค่ว่า "รูปทรงทุกแบบต้องคำนวณพื้นที่ได้" แต่ไม่บอกว่าคำนวณอย่างไร ใครพยายามสร้าง Shape() ตรงๆ จะเจอ TypeError ทันที เป็นการบังคับให้ทุกคนในทีมเขียน Class ลูกตามสัญญาเดียวกัน
ข้อดีของ OOP คืออะไร
จัดโค้ดเป็นหมวดหมู่: ข้อมูลกับการทำงานของเรื่องเดียวกันอยู่ใน Class เดียว เวลาหา Bug ก็รู้ว่าต้องไปเปิดที่ไหน
ป้องกันข้อมูลเสีย: Encapsulation บังคับให้การแก้ข้อมูลผ่านด่านตรวจ อย่างยอดเงินติดลบในตัวอย่างข้างบน
นำกลับมาใช้ซ้ำ: Inheritance ช่วยให้ไม่ต้องเขียนส่วนที่ซ้ำกันหลายรอบ
ต่อยอดได้โดยไม่แก้ของเดิม: Polymorphism ทำให้เพิ่มชนิดใหม่ได้โดยโค้ดที่เรียกใช้ไม่ต้องเปลี่ยน
ทำงานเป็นทีมง่ายขึ้น: Abstraction ทำให้แต่ละคนตกลงกันที่ Interface แล้วแยกกันเขียนไส้ในได้
ข้อดีเหล่านี้จะเห็นชัดขึ้นเมื่อโปรเจกต์ใหญ่ขึ้น ถ้าอยากต่อยอดเรื่องการจัดโค้ดให้อ่านง่าย อ่านต่อได้ที่ 7 เทคนิค Clean Code เพื่อโค้ดคุณภาพ
OOP ไม่ได้ดีทุกกรณี: ข้อจำกัดที่ควรรู้
ข้ออ้างของฝั่งที่บอกว่า OOP ล้าสมัยไม่ได้มาจากความว่างเปล่า ปัญหาที่เจอบ่อยที่สุดคือการใช้ Inheritance ซ้อนกันหลายชั้น พอแก้ Class แม่ตัวเดียว Class ลูกหลายตัวที่อยู่ไกลออกไปก็พังตาม เอกสาร Python เองก็อธิบายไว้ว่า Method ของ Class แม่ที่เรียก Method อื่นใน Class เดียวกัน อาจไปเรียกเวอร์ชันที่ Class ลูก Override (เขียนทับ) ไว้แทนโดยไม่ตั้งใจ
ทางออกที่นักพัฒนาหลายคนเลือกคือ Composition (การประกอบ) แทนที่จะบอกว่า "รถเป็นเครื่องยนต์ชนิดหนึ่ง" ให้บอกว่า "รถมีเครื่องยนต์" แนวคิดนี้มีมาตั้งแต่หนังสือ Design Patterns ของ Gamma และคณะเมื่อปี 1994 ที่แนะนำให้เลือก Object Composition ก่อน Class Inheritance
class Engine:
def start(self):
return "engine on"
class Car:
def __init__(self, engine):
self.engine = engine
def drive(self):
return f"{self.engine.start()}, car moving"
print(Car(Engine()).drive())engine on, car movingอยากเปลี่ยนเป็นมอเตอร์ไฟฟ้าก็แค่ส่ง Object ตัวใหม่ที่มี start() เข้าไป ไม่ต้องรื้อสายการสืบทอดทั้งเส้น ภาษา Go ไปไกลกว่านั้นอีก Go FAQ ตอบคำถามว่า Go เป็นภาษา OOP ไหมว่า "ใช่และไม่ใช่" เพราะ Go มี Type และ Method แต่ไม่มีลำดับชั้นของ Type และไม่มี Inheritance เลย ใช้ Interface แทน ถ้าอยากเห็นภาพว่าหน้าตาเป็นอย่างไร ดูได้ที่ JS2GO EP.16 Methods และ Interfaces ใน Go เทียบกับ JavaScript
อีกข้อคือ OOP ไม่จำเป็นกับงานเล็ก สคริปต์ 30 บรรทัดที่อ่านไฟล์แล้วสรุปตัวเลข เขียนเป็น Function สองสามตัวอ่านง่ายกว่าการสร้าง Class ห้าตัวมาครอบ
OOP กับ Functional Programming ต่างกันอย่างไร
Functional Programming (FP) คือรูปแบบที่เน้นเขียนโปรแกรมเป็น Function ที่รับค่าเข้าแล้วคืนค่าออก โดยพยายามไม่แก้ข้อมูลเดิม ขณะที่ OOP เน้นให้ Object ถือข้อมูลและเปลี่ยนสถานะของตัวเองผ่าน Method
OOP: เหมาะกับระบบที่มี "ของ" หลายชนิดซึ่งมีสถานะเปลี่ยนไปตามเวลา เช่น ตัวละครในเกม บัญชีผู้ใช้ หรือหน้าจอ UI
FP: เหมาะกับงานแปลงข้อมูลเป็นทอดๆ เช่น กรอง จัดเรียง แล้วสรุปรายการคำสั่งซื้อ
ในงานจริงสองแบบนี้ไม่ได้แยกขาดจากกัน Python และ JavaScript ใช้ได้ทั้งสองแบบในไฟล์เดียว ถ้ายังลังเลว่าจะเริ่มภาษาไหนก่อน ลองอ่าน JavaScript vs Python: มือใหม่ควรเริ่มจากภาษาไหนดี? และถ้าเขียน JavaScript อยู่แล้ว TypeScript จะเพิ่ม Interface และ Type ที่ทำให้แนวคิด Abstraction ในบทความนี้ใช้ได้จริงขึ้นมาก ส่วนใครที่เข้าใจ OOP แล้วอยากรู้ว่าคนเขาจัดวาง Class กันเป็นแบบแผนอย่างไร ไปต่อที่ Design Patterns สำหรับมือใหม่
สรุป: OOP ยังจำเป็นไหม
ตอบแบบตรงๆ ไม่อ้อม ทั้งสองฝั่งถูกครึ่งเดียว OOP ยังเป็นพื้นฐานที่ควรรู้ เพราะภาษาและ Framework จำนวนมากที่คุณจะเจอในงานใช้ Class เป็นหลัก ถ้าอ่าน Class กับ Object ไม่ออก จะอ่านโค้ดของทีมไม่ออกด้วย แต่ OOP ก็ไม่ใช่คำตอบเดียว Inheritance ที่ซ้อนลึกเกินไปสร้างปัญหาจริง และงานเล็กๆ เขียนเป็น Function ก็พอ
ไม่ต้องกังวลถ้าอ่านรอบแรกแล้วยังไม่เห็นภาพทั้ง 4 หลักการ เป็นเรื่องปกติของทุกคน ลองก๊อปตัวอย่างคุกกี้ไปรันเอง แล้วเพิ่ม Attribute ใหม่อย่าง size หรือสร้าง Class ลูก ChocolateChipCookie ดู การได้เห็นโค้ดพังแล้วแก้เองหนึ่งรอบ ช่วยให้เข้าใจมากกว่าอ่านนิยามซ้ำสิบรอบ
ติดตามบทความและเทคนิคสำหรับคนเริ่มต้นสายโปรแกรมเมอร์ได้ที่ช่องทางของเรา
Facebook: Superdev Academy Thailand (https://www.facebook.com/superdev.academy.th)
YouTube: Superdev Academy Channel (https://www.youtube.com/@SuperdevAcademy)
Instagram: @superdevacademy (https://www.instagram.com/superdevacademy/)
TikTok: @superdevacademy (https://www.tiktok.com/@superdevacademy?lang=th-TH)
FAQ: คำถามที่พบบ่อยเกี่ยวกับบทความนี้
รวมคำถามและคำตอบที่ช่วยให้คุณเข้าใจเนื้อหาในบทความนี้ได้ดียิ่งขึ้น