ในทางปฏิบัติจริง Python ไม่มีอะไรที่เรียกว่า private member variable ใน Python จริงๆ แต่การเพิ่ม underscore สองตัว (__) นำหน้าทำให้ตัวแปรหรือเมธอดเป็น private เป็นข้อตกลงที่ใช้โดยโค้ด Python ส่วนใหญ่
มาเข้าใจแนวคิดนี้ผ่านตัวอย่าง −
privateVar1.py
class myClass: __privateVar = 27; def __privMeth(self): print("I'm inside class myClass") def hello(self): print("Private Variable value: ",myClass.__privateVar) foo = myClass() foo.hello() foo.__privateMeth
ในโปรแกรมข้างต้น __privMeth เป็นเมธอด private และ __privateVar เป็นตัวแปร private มาดูผลลัพธ์ของมัน −
ผลลัพธ์
Private Variable value: 27 Traceback (most recent call last): File "C:/Python/Python361/privateVar1.py", line 12, infoo.__privateMeth AttributeError: 'myClass' object has no attribute '__privateMeth'
จากผลลัพธ์ข้างต้น เราเห็นได้ว่า นอกจากคลาส "myClass" คุณไม่สามารถเข้าถึงเมธอด private และตัวแปร private ได้ อย่างไรก็ตาม ภายในคลาส (myClass) เราสามารถเข้าถึงตัวแปร private ได้ ในเมธอด hello() ตัวแปร __privateVar สามารถเข้าถึงได้ (ตามที่แสดง: "Private Variable value: 27")
ดังนั้นจากตัวอย่างข้างต้น เราสามารถเข้าใจได้ว่า ตัวแปรและเมธอดทั้งหมดภายในคลาสเป็น public โดยค่าเริ่มต้น เมื่อเราประกาศสมาชิกข้อมูลเป็น private หมายถึงพวกมันเข้าถึงได้เฉพาะภายในคลาสและเข้าถึงไม่ได้จากนอกคลาส เทคนิคการทำให้ตัวแปรหรือเมธอดเป็น private เรียกว่า data mangling Identifier รูปแบบ __spam (อย่างน้อยสอง leading underscores, สูงสุดหนึ่ง trailing underscore) จะถูกแทนที่ข้อความด้วย _classname__spam โดยที่ classname คือชื่อคลาสปัจจุบันที่มี leading underscore(s) ถูกลบออก การ mangling นี้ทำโดยไม่คำนึงถึงตำแหน่งไวยากรณ์ของ identifier ตราบใดที่มันเกิดขึ้นภายในการกำหนดค่าของคลาส
ชื่อ double underscore นั้นมีเจตนาหลีกเลี่ยงการ override โดย subclass โดยบังเอิญแทน