Між приватними класами та приватними модулями може виникнути плутанина .
A модуль приватних починається з одного підкреслення
такого елемента не копіюється разом при використанні from <module_name> import *
форми команди імпорту; однак він імпортується, якщо використовує import <moudule_name>
синтаксис ( див. відповідь Бена Вільгельма ).
Просто видаліть один підкреслення з .__ номера прикладу запитання, і він не відображатиметься в модулях, які імпортують a.py за допомогою from a import *
синтаксису.
А клас приватні починається з двома символами підкреслення (ака Dunder тобто d-ouble під Score)
Такий змінний мають свою назву «викривлене» включити ім'я класу і т.д.
Це все ще може бути доступні за межі класу логіки, через спотворене ім'я.
Незважаючи на те, що назва манґлінгу може слугувати легким засобом запобігання проти несанкціонованого доступу, її головне призначення - запобігти можливим зіткненням імен з членами класів предків. Дивіться смішне, але точне посилання Алекса Мартеллі на згоду на дорослих, коли він описує конвенцію, використану стосовно цих змінних.
>>> 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/…