ใน Python OOP ตัวแปรมี 2 ระดับ: Class Variable (ระดับคลาส) และ Instance Variable (ระดับอินสแตนซ์) การเข้าใจความแตกต่างสำคัญมาก
ตัวอย่าง: พยายามเปลี่ยน Class Variable ผ่าน Instance
class Shark:
animal_type = 'fish' # Class Variable
def __init__(self, name, age):
self.name = name
self.age = age
obj1 = Shark("Jeeva", 54)
obj2 = Shark("Roli", 45)
print("obj1.animal_type =", obj1.animal_type) # fish
print("obj2.animal_type =", obj2.animal_type) # fish
# พยายามเปลี่ยนผ่าน instance
obj1.animal_type = "BigFish"
print("obj1.animal_type =", obj1.animal_type) # BigFish
print("obj2.animal_type =", obj2.animal_type) # fish (ไม่เปลี่ยน!)
เกิดอะไรขึ้น? การกำหนด obj1.animal_type = "BigFish" สร้าง Instance Variable ใหม่ ชื่อ animal_type บน obj1 ซึ่ง "บัง" (shadow) Class Variable เดิม ไม่ได้เปลี่ยนค่าจริงของคลาส
วิธีที่ถูกต้อง: เปลี่ยนผ่านคลาสโดยตรง
class Shark:
animal_type = 'fish'
def __init__(self, name, age):
self.name = name
self.age = age
obj1 = Shark("Jeeva", 54)
obj2 = Shark("Roli", 45)
# เปลี่ยนผ่านคลาส
Shark.animal_type = "BigFish"
print("obj1.animal_type =", obj1.animal_type) # BigFish
print("obj2.animal_type =", obj2.animal_type) # BigFish (ทั้งคู่เปลี่ยน!)
สรุป
| การเข้าถึง | ผลลัพธ์ |
|---|---|
instance.var = x | สร้าง instance variable ใหม่ (shadow class variable) |
Class.var = x | เปลี่ยน class variable จริง ส่งผลต่อทุก instance |
instance.__class__.var = x | เหมือนข้างบน เข้าถึงคลาสผ่านอินสแตนซ์ |
เข้าใจกลไกนี้จะป้องกันบั๊กที่ยากต่อการค้นหาเมื่อทำงานกับ class variables