Может быть путаница между рядовыми и рядовыми .
A модуль private начинается с одно подчеркивание
Такой элемент не копируется при использовании формы from <module_name> import *
команды import; однако он импортируется при использовании синтаксиса import <moudule_name>
( см. ответ Бена Вильгельма )
Просто удалите одно подчеркивание из числа .__ примера вопроса, и оно не будет отображаться в модулях, импортирующих a.py с использованием синтаксиса from a import *
.
A класс приватный начинается с два подчеркивания (он же dunder, т.е. d-ouble знак ниже)
Такая переменная имеет название "искаженный", чтобы включать имя класса и т. Д.
К нему все еще можно получить доступ за пределами логики класса через искаженное имя.
Хотя искажение имени может служить средством для предотвращения несанкционированного доступа, его основная цель - предотвратить возможные конфликты имен с членами классов классов-предков.
См. Забавную, но точную ссылку Алекса Мартелли на согласных взрослых , поскольку он описывает соглашение, используемое в отношении этих переменных.
>>> 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
>>>