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

ตัวแปรส่วนตัวในโปรแกรม Python


ในบทช่วยสอนนี้ เราจะเรียนรู้เกี่ยวกับตัวแปรส่วนตัว ใน 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 (การโทรล่าสุดล่าสุด) ใน 14 15 # เรียกใช้เมธอดด้วยชื่อผิด---> 16 พิมพ์ (sample.__get_a ()) AttributeError:วัตถุ 'Sample' ไม่มีแอตทริบิวต์ '__get_a'

บทสรุป

จุดประสงค์ของการใช้ ขีดล่างคู่ ไม่ได้จำกัดการเข้าถึงตัวแปรหรือวิธีการ เป็นการบอกว่าตัวแปรหรือวิธีการเฉพาะนั้นหมายถึงการผูกมัดภายในคลาสเท่านั้น หากคุณมีข้อสงสัยใดๆ ในบทแนะนำ โปรดระบุในส่วนความคิดเห็น