เมื่อเราสร้างอินสแตนซ์ของคลาสใน 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]