Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

การเปลี่ยนแปลง Class Members ใน Python: Class Variable vs Instance Variable

ใน 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