On this page
Class & Object
พิมพ์เขียว (class) กับของจริง (object), attribute, method, self และ __init__ — รากฐานของ OOP
เมื่อโปรแกรมใหญ่ขึ้น ตัวแปรและฟังก์ชันที่กระจัดกระจายเริ่มจัดการยาก Object-Oriented Programming (OOP) คือวิธีจัดระเบียบโค้ดโดยมัด "ข้อมูล" กับ "การกระทำกับข้อมูลนั้น" ไว้ด้วยกันเป็น object เหมือนของในโลกจริง บทนี้เป็นหนึ่งใน prerequisite ที่ระบุไว้ใน roadmap
Class คือพิมพ์เขียว Object คือของจริง
Class คือ "แม่แบบ" ที่บอกว่าสิ่งหนึ่งมีข้อมูลอะไรและทำอะไรได้ ส่วน Object คือ "ของจริง" ที่สร้างจากแม่แบบนั้น เช่น class "สุนัข" เป็นแบบ ส่วนเจ้าไข่ดาวกับเจ้าโมจิคือ object 2 ตัวที่สร้างจาก class เดียวกัน
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 ใส่ให้อัตโนมัติ
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__ (อ่านว่า "dunder init" — double underscore) คือ constructor ที่ทำงานทันทีตอนสร้าง object ใช้ตั้งค่าเริ่มต้นให้ attribute เวลาเขียน Dog("ไข่ดาว", 3) ค่าทั้งสองจะถูกส่งเข้า __init__ โดย Python เรียก __init__ ให้เองอัตโนมัติ
attribute vs method
| attribute | method | |
|---|---|---|
| คืออะไร | ข้อมูลของ object | การกระทำของ object |
| เปรียบเทียบ | คำนาม (ชื่อ, อายุ) | คำกริยา (เห่า, วิ่ง) |
| เข้าถึง | d1.name | d1.bark() |
| นิยามที่ | ใน __init__ (self.x = ...) | เป็น def ใน class |
ตัวอย่างที่สมบูรณ์: BankAccount
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 ให้เก็บประวัติการทำรายการในลิสต์