Python ฟังก์ชัน __init__()

ใน Python ฟังก์ชัน __init__() คือ “constructor” หรือ “ตัวสร้าง” ที่ใช้สำหรับการกำหนดค่าเริ่มต้นให้กับวัตถุ (Object) ที่สร้างขึ้นจากคลาส (Class) ฟังก์ชันนี้จะถูกเรียกโดยอัตโนมัติทุกครั้งที่มีการสร้างอินสแตนซ์ใหม่ของคลาส การใช้งาน __init__() สามารถประยุกต์ได้หลากหลายรูปแบบ ขึ้นอยู่กับการกำหนดค่าหรือคุณสมบัติของวัตถุแต่ละตัว

การใช้งานทั่วไปของ __init__()

กำหนดค่าเริ่มต้นให้กับวัตถุ

ฟังก์ชัน __init__() ถูกใช้เพื่อกำหนดค่าเริ่มต้น (Initial Values) ให้กับคุณสมบัติ (Attribute) ของวัตถุ

Python
class Person:
    def __init__(self, name, age):
        self.name = name  # กำหนดค่าชื่อ
        self.age = age    # กำหนดค่าอายุ

# สร้างวัตถุจากคลาส Person
person1 = Person("John", 30)
person2 = Person("Alice", 25)

print(person1.name)  # Output: John
print(person2.age)   # Output: 25

ในตัวอย่างนี้ ฟังก์ชัน __init__() จะกำหนดค่าชื่อ (name) และอายุ (age) ให้กับแต่ละวัตถุเมื่อมีการสร้างวัตถุจากคลาส Person

การประยุกต์ใช้งาน __init__() รูปแบบต่าง ๆ

การกำหนดค่าเริ่มต้นแบบคงที่

เราสามารถกำหนดค่าเริ่มต้นให้กับพารามิเตอร์ใน __init__() ได้ หากไม่มีการส่งค่ามาในตอนสร้างวัตถุ

Python
class Car:
    def __init__(self, brand, model="Unknown"):
        self.brand = brand
        self.model = model

# สร้างวัตถุจากคลาส Car
car1 = Car("Toyota", "Corolla")
car2 = Car("Honda")  # ไม่ได้ส่งค่า model มา จะใช้ค่า "Unknown"

print(car1.model)  # Output: Corolla
print(car2.model)  # Output: Unknown

ในตัวอย่างนี้ หากไม่มีการส่งค่า model มา จะใช้ค่าเริ่มต้นว่า “Unknown”

การทำงานเพิ่มเติมภายใน __init__()

นอกจากการกำหนดค่าเริ่มต้น เราสามารถให้ __init__() ทำงานอื่นๆ เช่น การตรวจสอบข้อมูล หรือการปรับเปลี่ยนข้อมูลก่อนจะกำหนดให้กับคุณสมบัติของวัตถุ

Python
class Employee:
    def __init__(self, name, salary):
        self.name = name
        if salary < 0:
            self.salary = 0  # ตรวจสอบไม่ให้เงินเดือนติดลบ
        else:
            self.salary = salary

# สร้างวัตถุจากคลาส Employee
emp1 = Employee("Bob", 30000)
emp2 = Employee("Alice", -5000)  # เงินเดือนติดลบจะถูกปรับเป็น 0

print(emp1.salary)  # Output: 30000
print(emp2.salary)  # Output: 0

ในตัวอย่างนี้ มีการตรวจสอบค่า salary ใน __init__() และปรับค่าให้เป็น 0 หากเงินเดือนติดลบ

การใช้ __init__() ร่วมกับการสืบทอด (Inheritance)

เมื่อเราสร้างคลาสใหม่ที่สืบทอดจากคลาสเดิม เราสามารถเรียกใช้ฟังก์ชัน __init__() ของคลาสแม่ผ่าน super() เพื่อกำหนดค่าจากคลาสแม่ได้

Python
class Animal:
    def __init__(self, name):
        self.name = name

class Dog(Animal):
    def __init__(self, name, breed):
        super().__init__(name)  # เรียกใช้ __init__() ของคลาส Animal
        self.breed = breed

# สร้างวัตถุจากคลาส Dog
dog = Dog("Buddy", "Golden Retriever")

print(dog.name)   # Output: Buddy
print(dog.breed)  # Output: Golden Retriever

ในตัวอย่างนี้ Dog สืบทอดจาก Animal และใช้ super() ใน __init__() เพื่อเรียกใช้ฟังก์ชัน __init__() ของคลาสแม่

การกำหนดค่าเริ่มต้นที่ซับซ้อนใน __init__()

ฟังก์ชัน __init__() สามารถประยุกต์ใช้เพื่อกำหนดค่าเริ่มต้นที่ซับซ้อน เช่น การสร้างวัตถุภายในวัตถุ

Python
class Engine:
    def __init__(self, horsepower):
        self.horsepower = horsepower

class Car:
    def __init__(self, brand, engine_horsepower):
        self.brand = brand
        self.engine = Engine(engine_horsepower)  # กำหนดวัตถุ Engine ให้กับ Car

# สร้างวัตถุจากคลาส Car
car = Car("Toyota", 150)

print(car.brand)            # Output: Toyota
print(car.engine.horsepower)  # Output: 150

ในตัวอย่างนี้ Car มีการสร้างวัตถุ Engine ภายใน __init__() เพื่อใช้ในวัตถุของคลาส Car

การใช้ __init__() ร่วมกับ Default Values สำหรับค่าสำคัญ

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

Python
class Account:
    def __init__(self, holder, balance=0):
        self.holder = holder
        self.balance = balance

# สร้างวัตถุจากคลาส Account
acc1 = Account("John", 500)  # กำหนดค่า balance เอง
acc2 = Account("Alice")      # ใช้ค่า balance เริ่มต้นเป็น 0

print(acc1.balance)  # Output: 500
print(acc2.balance)  # Output: 0

ในตัวอย่างนี้ balance มีค่าเริ่มต้นเป็น 0 ถ้าไม่ได้กำหนดค่ามา

การจัดการ Exception ใน __init__()

เราสามารถใช้ __init__() เพื่อจัดการกับข้อผิดพลาด (Exception) เมื่อข้อมูลที่รับเข้ามาไม่ถูกต้อง

Python
class Product:
    def __init__(self, name, price):
        self.name = name
        if price < 0:
            raise ValueError("Price cannot be negative!")  # ข้อผิดพลาดเมื่อราคาเป็นลบ
        self.price = price

# สร้างวัตถุจากคลาส Product
try:
    prod = Product("Laptop", -1000)
except ValueError as e:
    print(e)  # Output: Price cannot be negative!

ในตัวอย่างนี้ __init__() จัดการข้อผิดพลาดโดยการยกข้อผิดพลาดเมื่อมีการใส่ราคาที่ติดลบ

สรุป

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

แชร์เรื่องนี้