Puede haber confusión entre las clases privadas y las módulos privadas .
Un módulo privado comienza con un guión bajo.
Este elemento no se copia cuando se utiliza el from <module_name> import *
formulario del comando de importación; sin embargo, se importa si se usa la import <moudule_name>
sintaxis ( vea la respuesta de Ben Wilhelm )
Simplemente elimine un guión bajo del número a .__ del ejemplo de la pregunta y no se mostrará en los módulos que importan a.py usando la from a import *
sintaxis.
Una clase privada comienza con dos guiones bajos (también conocido como dunder, es decir, d-ouble under-score).
Dicha variable tiene su nombre "mutilado" para incluir el nombre de la clase, etc.
Todavía se puede acceder fuera de la lógica de la clase, a través del nombre mutilado.
Aunque el cambio de nombre puede servir como un dispositivo de prevención leve contra el acceso no autorizado, su objetivo principal es evitar posibles colisiones de nombres con miembros de la clase de antepasados. Vea la referencia divertida pero precisa de Alex Martelli a los adultos que consienten mientras describe la convención utilizada con respecto a estas variables.
>>> 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 () es una instancia de clase. Lo que da esta excepción cuando usa doble guión bajo. Mientras que en su caso, no creó una clase, simplemente creó un módulo. Ver también: stackoverflow.com/questions/70528/...