ในบทช่วยสอนนี้ เราจะเรียนรู้เกี่ยวกับตัวแปรส่วนตัว ใน Python คลาส .
Python ไม่มีแนวคิดที่เรียกว่า ตัวแปรส่วนตัว . แต่นักพัฒนา Python ส่วนใหญ่ปฏิบัติตามหลักการตั้งชื่อเพื่อบอกว่าตัวแปรไม่เป็นสาธารณะและเป็นส่วนตัว
เราต้องเริ่มชื่อตัวแปรด้วย ขีดล่างคู่ เพื่อแสดงเป็นตัวแปรส่วนตัว (ไม่ใช่จริงๆ) ตัวอย่าง:- หนึ่ง สอง ฯลฯ ..,..
ดังที่เราได้กล่าวไปแล้วว่าตัวแปรที่มีชื่อขึ้นต้นด้วยเครื่องหมายขีดล่างคู่นั้นไม่เป็นส่วนตัว เรายังคงสามารถเข้าถึงได้ มาดูวิธีสร้างตัวแปรประเภทไพรเวตกัน แล้วมาดูวิธีเข้าถึงกัน
# การสร้างคลาสคลาส ตัวอย่าง:def __init__(self, nv, pv):# ตัวแปรปกติ self.nv =nv # ตัวแปรส่วนตัว (ไม่ใช่จริงๆ) self.__pv =pv# การสร้างอินสแตนซ์ของคลาส Samplesample =Sample( 'ตัวแปรปกติ', 'ตัวแปรส่วนตัว')
เราได้สร้างคลาสและอินสแตนซ์ของคลาสแล้ว เรามีตัวแปรสองตัว ตัวหนึ่งเป็นแบบปกติและอีกตัวเป็นเอกเทศภายในเมธอด __init__ ตอนนี้ พยายามเข้าถึงตัวแปร และดูว่าเกิดอะไรขึ้น
ตัวอย่าง
# การสร้างคลาสคลาส ตัวอย่าง:def __init__(self, nv, pv):# ตัวแปรปกติ self.nv =nv # ตัวแปรส่วนตัว (ไม่ใช่จริงๆ) self.__pv =pv# การสร้างอินสแตนซ์ของคลาส Samplesample =Sample( 'ตัวแปรปกติ', 'ตัวแปรส่วนตัว')# กำลังเข้าถึง *nv*print(sample.nv)# กำลังเข้าถึง *__pv**print(sample.__pv)
ผลลัพธ์
หากคุณเรียกใช้โค้ดด้านบน คุณจะได้ผลลัพธ์ดังต่อไปนี้
ตัวแปรปกติ--------------------------------------------- ------------------------------ AttributeError Traceback (การโทรล่าสุดล่าสุด)ใน <โมดูล> 14 15 # กำลังเข้าถึง *__pv**---> 16 พิมพ์ (sample.__pv) AttributeError:วัตถุ 'ตัวอย่าง' ไม่มีแอตทริบิวต์ '__pv'
โปรแกรมแสดงตัวแปร nv โดยไม่มีข้อผิดพลาด แต่เราได้รับ AttributeError เมื่อเราพยายามเข้าถึง __pv ตัวแปร
เหตุใดเราจึงได้รับข้อผิดพลาดนี้ เนื่องจากไม่มีแอตทริบิวต์ใดที่มีชื่อตัวแปร __pv . แล้ว self.__pv =pv . ล่ะ คำสั่งในวิธี init? เราจะพูดถึงเรื่องนี้ในอีกสักครู่ ขั้นแรก มาดูวิธีเข้าถึง __pv ตัวแปร
เราสามารถเข้าถึงตัวแปรคลาสใดก็ได้ที่มีชื่อขึ้นต้นด้วย ขีดล่างคู่ เป็น _className\_variableName_ . ดังนั้น ในหรือตัวอย่าง มันคือ_Sample\_pv_ . ตอนนี้ เข้าถึงโดยใช้ _Sample\_pv_ ชื่อ.
ตัวอย่าง
# การสร้างคลาสคลาส ตัวอย่าง:def __init__(self, nv, pv):# ตัวแปรปกติ self.nv =nv # ตัวแปรส่วนตัว (ไม่ใช่จริงๆ) self.__pv =pv# การสร้างอินสแตนซ์ของคลาส Samplesample =Sample( 'ตัวแปรปกติ', 'ตัวแปรส่วนตัว')# กำลังเข้าถึง *nv*print(sample.nv)# กำลังเข้าถึง *__pv** โดยใช้ _Sample__pv nameprint(sample._Sample__pv)
ผลลัพธ์
หากคุณเรียกใช้โค้ดด้านบน คุณจะได้ผลลัพธ์ดังต่อไปนี้
ตัวแปรปกติตัวแปรส่วนตัว
ทำไมชื่อตัวแปร __pv เปลี่ยนไปไหม
ใน Python มีแนวคิดที่เรียกว่า name mangling Python เปลี่ยนชื่อตัวแปรที่ขึ้นต้นด้วย ขีดล่างคู่ . ดังนั้น ตัวแปรคลาสใดๆ ที่ชื่อขึ้นต้นด้วยเครื่องหมายขีดล่างคู่จะเปลี่ยนเป็นรูปแบบ _className\_variableName_ .
ดังนั้น แนวความคิดก็จะนำไปใช้กับ method ของ class เช่นกัน ดูได้จากโค้ดต่อไปนี้
ตัวอย่าง
class Sample:def __init__(self, a):self.a =a # private method(not really) def __get_a(self):return self.a# การสร้างอินสแตนซ์ของคลาส Samplesample =Sample(5)# การเรียกใช้ เมธอดที่มี nameprint(sample._Sample__get_a())# ที่ถูกต้อง เรียกใช้เมธอดด้วย nameprint(sample.__get_a()) ที่ไม่ถูกต้อง
ผลลัพธ์
หากคุณเรียกใช้โค้ดด้านบน คุณจะได้ผลลัพธ์ดังต่อไปนี้
<ก่อนหน้า>5--------------------------------------------- ------------------------------------ AttributeError Traceback (การโทรล่าสุดล่าสุด)บทสรุป
จุดประสงค์ของการใช้ ขีดล่างคู่ ไม่ได้จำกัดการเข้าถึงตัวแปรหรือวิธีการ เป็นการบอกว่าตัวแปรหรือวิธีการเฉพาะนั้นหมายถึงการผูกมัดภายในคลาสเท่านั้น หากคุณมีข้อสงสัยใดๆ ในบทแนะนำ โปรดระบุในส่วนความคิดเห็น