Pode haver confusão entre o privado da classe e o privado do módulo .
Um módulo privado começa com um sublinhado.
Esse elemento não é copiado ao usar o from <module_name> import *
formulário do comando import; no entanto, é importado se você estiver usando a import <moudule_name>
sintaxe ( consulte a resposta de Ben Wilhelm )
Simplesmente remova um sublinhado do a .__ num do exemplo da pergunta e não será exibido nos módulos que importam a.py usando a from a import *
sintaxe.
Uma classe privada começa com dois sublinhados (também conhecido como dunder, ou seja, sub-pontuação d-ouble).
Essa variável tem o nome "desconfigurado" para incluir o nome da classe, etc.
Ela ainda pode ser acessada fora da lógica da classe, através do nome desconfigurado.
Embora o nome errado possa servir como um dispositivo de prevenção moderado contra acesso não autorizado, seu principal objetivo é evitar possíveis colisões de nomes com membros da classe das classes ancestrais. Veja a referência engraçada, mas precisa, de Alex Martelli a adultos que consentem, enquanto ele descreve a convenção usada em relação a essas variáveis.
>>> 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 () é uma instância da classe. O que gera essa exceção quando você usa sublinhado duplo. Enquanto no seu caso, você não criou uma classe, apenas criou um módulo. Veja também: stackoverflow.com/questions/70528/…