Notes & software courses · Free to learn
Aph's Blog
On this page

Class & Object

👋 อ่านฟรีทั้งหมดบน Aph's Blog — เนื้อหาภาษาไทย ทำตามทีละหน้าใน sidebar ได้เลย หากมีข้อเสนอแนะหรืออยากให้เพิ่มหัวข้อไหน บอกได้เสมอ

พิมพ์เขียว (class) กับของจริง (object), attribute, method, self และ __init__ — รากฐานของ OOP

เมื่อโปรแกรมใหญ่ขึ้น ตัวแปรและฟังก์ชันที่กระจัดกระจายเริ่มจัดการยาก Object-Oriented Programming (OOP) คือวิธีจัดระเบียบโค้ดโดยมัด "ข้อมูล" กับ "การกระทำกับข้อมูลนั้น" ไว้ด้วยกันเป็น object เหมือนของในโลกจริง บทนี้เป็นหนึ่งใน prerequisite ที่ระบุไว้ใน roadmap

Class คือพิมพ์เขียว Object คือของจริง

Class คือ "แม่แบบ" ที่บอกว่าสิ่งหนึ่งมีข้อมูลอะไรและทำอะไรได้ ส่วน Object คือ "ของจริง" ที่สร้างจากแม่แบบนั้น เช่น class "สุนัข" เป็นแบบ ส่วนเจ้าไข่ดาวกับเจ้าโมจิคือ object 2 ตัวที่สร้างจาก class เดียวกัน

python
class Dog:
    # __init__ ทำงานอัตโนมัติตอนสร้าง object ใช้ตั้งค่าเริ่มต้น
    def __init__(self, name, age):
        self.name = name      # attribute (ข้อมูลของ object)
        self.age = age

    def bark(self):           # method (การกระทำของ object)
        return f"{self.name} เห่า: โฮ่ง!"

# สร้าง object จาก class
d1 = Dog("ไข่ดาว", 3)
d2 = Dog("โมจิ", 5)

print(d1.name)      # ไข่ดาว     (เข้าถึง attribute ด้วยจุด)
print(d1.bark())    # ไข่ดาว เห่า: โฮ่ง!
print(d2.age)       # 5
d1.age = 4          # แก้ attribute ได้
print(d1.age)       # 4

ทำความเข้าใจ self

self หมายถึง "ตัว object นั้นเอง" ทุก method ต้องมี self เป็น parameter แรก เพื่อให้เข้าถึงข้อมูลของ object ตัวที่กำลังทำงานอยู่ เวลาเรียกใช้ (d1.bark()) ไม่ต้องส่ง self เอง Python ใส่ให้อัตโนมัติ

python
class Counter:
    def __init__(self):
        self.count = 0        # ทุก object มี count ของตัวเอง

    def increment(self):
        self.count += 1       # แก้ count ของ object ตัวนี้

    def show(self):
        print(f"นับได้ {self.count}")

c1 = Counter()
c2 = Counter()
c1.increment()
c1.increment()
c2.increment()
c1.show()   # นับได้ 2
c2.show()   # นับได้ 1   (แยกกันคนละ object)
__init__ คืออะไร

__init__ (อ่านว่า "dunder init" — double underscore) คือ constructor ที่ทำงานทันทีตอนสร้าง object ใช้ตั้งค่าเริ่มต้นให้ attribute เวลาเขียน Dog("ไข่ดาว", 3) ค่าทั้งสองจะถูกส่งเข้า __init__ โดย Python เรียก __init__ ให้เองอัตโนมัติ

attribute vs method

attributemethod
คืออะไรข้อมูลของ objectการกระทำของ object
เปรียบเทียบคำนาม (ชื่อ, อายุ)คำกริยา (เห่า, วิ่ง)
เข้าถึงd1.named1.bark()
นิยามที่ใน __init__ (self.x = ...)เป็น def ใน class

ตัวอย่างที่สมบูรณ์: BankAccount

python
class BankAccount:
    def __init__(self, owner, balance=0):
        self.owner = owner
        self.balance = balance

    def deposit(self, amount):
        self.balance += amount
        return self.balance

    def withdraw(self, amount):
        if amount > self.balance:
            return "ยอดเงินไม่พอ"
        self.balance -= amount
        return self.balance

acc = BankAccount("Aphisit", 1000)
acc.deposit(500)
print(acc.withdraw(2000))   # ยอดเงินไม่พอ
print(acc.balance)          # 1500

สรุปหัวข้อนี้

  • Class = พิมพ์เขียว (แม่แบบ), Object = ของจริงที่สร้างจาก class
  • attribute = ข้อมูลของ object (self.x), method = การกระทำ (def ใน class)
  • self = ตัว object เอง ต้องเป็น parameter แรกของทุก method
  • __init__ คือ constructor ทำงานตอนสร้าง object ใช้ตั้งค่าเริ่มต้น
  • แต่ละ object เก็บข้อมูลของตัวเองแยกกัน
แบบฝึกหัด

1) สร้าง class Student เก็บชื่อ คะแนน และ method grade() คืนเกรด 2) สร้าง class Rectangle ที่มี method area() และ perimeter() 3) สร้าง class Counter ที่ increment/decrement/reset ได้ 4) สร้าง class Circle รับรัศมี มี method หาพื้นที่และเส้นรอบวง 5) ขยาย BankAccount ให้เก็บประวัติการทำรายการในลิสต์