2011-09-30 15 views
7

He visto un código en el que las funciones/constantes tienen como prefijo subrayados. Según tengo entendido, esto indica que no se deben usar directamente. ¿Puedo hacer esto con las clases?¿Es una convención prefijar las clases privadas con guiones bajos?

class _Foo(object): 
    pass 

class __Bar(object): 
    pass 
+3

'__' está reservado por Python. Nunca uses esto. En la mayoría de los casos, genera problemas con el cambio de nombre. Intenta evitar pensar que esto es útil. Trate de pensar en esto como "reservado" y "no para uso general" y "un problema que está por ocurrir". Y luego, por favor sáquelo de su pregunta. –

+0

Por favor explique qué clase "privada" podría ser. ¿Puede proporcionar un caso de uso o una situación en la que usaría esto? –

+0

Se exportarán funciones que el usuario debería usar. En estas funciones, creará una instancia de estas clases "privadas". – canadadry

Respuesta

6

Mejor solo use uno _. Esto indica que un nombre es privado dentro de un módulo.

No se importa con el from <module> import * catch-all, y tiene algunas otras características como "destrucción preferida".

De here:

Si __all__ no está definido, el conjunto de nombres público incluye todos los nombres que se encuentran en el espacio del módulo que no comienzan con un carácter de subrayado ('_').

De here:

partir de la versión 1.5, Python garantiza que las variables globales cuyo nombre comienza con un solo subrayado se eliminan de su módulo antes de eliminar otras variables globales.

Los miembros de la clase de inicio de doble subrayado son name-mangled.

5

Sí; el uso del subrayado único está respaldado por PEP8 para las clases de uso interno.

No creo que el doble guión tenga un efecto real la mayoría de las veces, ya que se utiliza para cambiar el nombre activo de los atributos de clase, y generalmente una clase no es un atributo de otra clase (concedido, puede ser, en cuyo caso Python hará feliz el nombre para usted.)

2

Puede usar un guion bajo como el primer carácter de cualquier variable, pero tiene el significado implícito, "No use fuera de la clase/módulo a menos que realmente sepa lo que está haciendo "(por ejemplo, previsto protegido/interno) y no se importará si utiliza from <module> import *. Usar un guion bajo doble es algo que nunca debes hacer fuera de una clase ya que podría interferir con el nombre "(podría significar," me causó un gran dolor de cabeza la semana pasada porque no me di cuenta que lo hace ").

2

Sí, y esto no es solo una convención. Cuando import * desde este módulo, los nombres que comienzan con guión bajo no se importarán.

+1

Consulte la respuesta de glglgl, eso solo si '__all__' no está definido. Puede incluir los nombres prefijados de subrayado en su '__all__' si lo desea. – agf

Cuestiones relacionadas