อาจจะมีความสับสนระหว่างเอกชนชั้นและไพร่พลโมดูล
โมดูลส่วนตัวเริ่มต้นด้วยหนึ่งขีด
องค์ประกอบดังกล่าวจะไม่คัดลอกพร้อมเมื่อใช้from <module_name> import *
รูปแบบของคำสั่งนำเข้า; อย่างไรก็ตามจะถูกนำเข้าหากใช้import <moudule_name>
ไวยากรณ์ ( ดูคำตอบของ Ben Wilhelm )
เพียงลบขีดล่างหนึ่งอันออกจาก a. _ จำนวนตัวอย่างของคำถามและจะไม่แสดงในโมดูลที่นำเข้า a.py โดยใช้from a import *
ไวยากรณ์
ระดับส่วนตัวเริ่มต้นด้วยสองขีด (aka Dunder คือ D-ouble ภายใต้คะแนน)
เช่นตัวแปรมีชื่อของ "mangled" เพื่อรวม ClassName ฯลฯ
มันยังสามารถเข้าถึงนอกของตรรกะระดับผ่านชื่อ mangled
แม้ว่าชื่อ mangling สามารถทำหน้าที่เป็นอุปกรณ์ป้องกันที่ไม่รุนแรงต่อการเข้าถึงที่ไม่ได้รับอนุญาตจุดประสงค์หลักของมันคือเพื่อป้องกันการชนกันของชื่อที่เป็นไปได้กับสมาชิกคลาสของคลาสบรรพบุรุษ ดูการอ้างอิงที่ตลก แต่ถูกต้องของ Alex Martelli เพื่อให้ความยินยอมแก่ผู้ใหญ่ในขณะที่เขาอธิบายการประชุมที่ใช้เกี่ยวกับตัวแปรเหล่านี้
>>> class Foo(object):
... __bar = 99
... def PrintBar(self):
... print(self.__bar)
...
>>> myFoo = Foo()
>>> myFoo.__bar #direct attempt no go
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Foo' object has no attribute '__bar'
>>> myFoo.PrintBar() # the class itself of course can access it
99
>>> dir(Foo) # yet can see it
['PrintBar', '_Foo__bar', '__class__', '__delattr__', '__dict__', '__doc__', '__
format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__',
'__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__
', '__subclasshook__', '__weakref__']
>>> myFoo._Foo__bar #and get to it by its mangled name ! (but I shouldn't!!!)
99
>>>
>>> import fileinfo >>> m = fileinfo.MP3FileInfo() >>> m.__parse("/music/_singles/kairo.mp3") 1 Traceback (innermost last): File "<interactive input>", line 1, in ? AttributeError: 'MP3FileInfo' instance has no attribute '__parse'
fileinfo.MP3FileInfo () เป็นตัวอย่างของคลาส ซึ่งให้ข้อยกเว้นนี้เมื่อคุณใช้ขีดเส้นใต้คู่ ในกรณีของคุณคุณไม่ได้สร้างคลาสคุณเพิ่งสร้างโมดูล ดูเพิ่มเติมที่: stackoverflow.com/questions/70528/…