Может быть путаница между рядовыми и рядовыми .
Закрытый модуль начинается с одного подчеркивания.
Такой элемент не копируется при использовании 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/…