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

ป้องกันไม่ให้ข้อมูลคลาสถูกแชร์ระหว่างอินสแตนซ์ใน Python

เมื่อเราสร้างอินสแตนซ์ของคลาสใน Python ตัวแปรและฟังก์ชันทั้งหมดจะถูกสืบทอดไปยังอินสแตนซ์ใหม่ แต่บางครั้งเราไม่ต้องการให้ตัวแปรบางอย่างของคลาสแม่ถูกสืบทอดโดยคลาสลูก บทความนี้จะสำรวจสองวิธีในการทำเช่นนั้น

ตัวอย่างการสร้างอินสแตนซ์ (Instantiation Example)

ในตัวอย่างด้านล่างแสดงว่าตัวแปรถูกสืบทอดจากคลาสและถูกแชร์ข้ามอินสแตนซ์ทั้งหมดที่สร้างขึ้น

class MyClass:
    listA = []  # ตัวแปรคลาส (Class variable)

# สร้างอินสแตนซ์ทั้งสอง
x = MyClass()
y = MyClass()

# จัดการข้อมูลทั้งสองอินสแตนซ์
x.listA.append(10)
y.listA.append(20)
x.listA.append(30)
y.listA.append(40)

# แสดงผล
print("Instance X:", x.listA)
print("Instance Y:", y.listA)

ผลลัพธ์

การรันโค้ดข้างต้นจะได้ผลดังนี้ −

Instance X: [10, 20, 30, 40]
Instance Y: [10, 20, 30, 40]

เห็นว่าทั้งสองอินสแตนซ์แชร์ listA เดียวกัน

ใช้ตัวแปรส่วนตัว (Private) กับ __init__

เราสามารถใช้เมธอด __init__ เพื่อทำให้ตัวแปรภายในคลาสเป็นตัวแปรส่วนตัว (instance variable) ตัวแปรเหล่านี้จะไม่ถูกแชร์ข้ามอินสแตนซ์เมื่อคลาสแม่ถูกสร้างอินสแตนซ์

ตัวอย่าง

class MyClass:
    def __init__(self):
        self.listA = []  # ตัวแปรอินสแตนซ์ (Instance variable)

# สร้างอินสแตนซ์ทั้งสอง
x = MyClass()
y = MyClass()

# จัดการข้อมูลทั้งสองอินสแตนซ์
x.listA.append(10)
y.listA.append(20)
x.listA.append(30)
y.listA.append(40)

# แสดงผล
print("Instance X:", x.listA)
print("Instance Y:", y.listA)

ผลลัพธ์

การรันโค้ดข้างต้นจะได้ผลดังนี้ −

Instance X: [10, 30]
Instance Y: [20, 40]

ประกาศตัวแปรภายนอกคลาส

ในวิธีนี้ เราจะประกาศตัวแปรใหม่ภายนอกคลาสหลังจากสร้างอินสแตนซ์ ตัวแปรจะถูกเริ่มต้นใหม่ จึงไม่ถูกแชร์ข้ามอินสแตนซ์ที่สร้างขึ้น

ตัวอย่าง

class MyClass:
    listA = []

# สร้างอินสแตนซ์ทั้งสอง
x = MyClass()
y = MyClass()

# ประกาศตัวแปรใหม่สำหรับแต่ละอินสแตนซ์
x.listA = []
y.listA = []

# จัดการข้อมูล
x.listA.append(10)
y.listA.append(20)
x.listA.append(30)
y.listA.append(40)

# แสดงผล
print("Instance X:", x.listA)
print("Instance Y:", y.listA)

ผลลัพธ์

การรันโค้ดข้างต้นจะได้ผลดังนี้ −

Instance X: [10, 30]
Instance Y: [20, 40]