2009-06-01 27 views
35

¿Cuál es la diferencia entre __method__, method y _method__?Diferencia entre "__method__" y "método"

¿Hay alguna o alguna razón aleatoria por la que la gente pensó que __doc__ debería ser así en lugar de doc? ¿Qué hace que un método sea más especial que el otro?

Respuesta

72

Desde la guía de estilo:

  • _single_leading_underscore: débil indicador de "uso interno". P.ej. from M import * no importa objetos cuyo nombre comience con un guión bajo.

  • single_trailing_underscore_: utilizado por convención para evitar conflictos con palabra clave de Python, p.

    Tkinter.Toplevel(master, class_='ClassName') 
    
  • __double_leading_underscore: al nombrar un atributo de clase, invoca el nombre mangling (dentro de la clase FooBar, __boo convierte _FooBar__boo; véase más adelante).

  • __double_leading_and_trailing_underscore__: objetos "mágicos" o atributos que viven en espacios de nombres controlados por el usuario. P.ej. __init__, __import__ o __file__. Nunca inventes tales nombres; solo utilícelos según lo documentado.

+6

__method no es realmente privado, está destrozado con el nombre de clase pero todavía se puede acceder normalmente. +1 sin embargo. –

+0

@Bastien - ¡gracias por mejorar el formateo! –

+1

-1. porque __x no es privado en el sentido de OOP, y ese no es el punto. El objetivo es evitar dos clases que usen el mismo atributo por error. Es la entrega del espacio de nombres, en lugar de privada/protegida. –

0

Los métodos con prefijos y con el doble guión bajo están generalmente marcados para indicar que son parte de la especificación del lenguaje Python.

1

Estos métodos se nombraron como tales para reducir la posibilidad de nombrar colisiones.

0

Algunos métodos con un prefijo de subrayado doble y el sufijo son especiales. Por ejemplo, se llama al __init__ siempre que se crea una instancia de esa clase, y se llama al __str__ cuando se va a imprimir el objeto. Básicamente, pueden ser llamados de maneras especiales. Puede usarlos como cualquier otro método, o puede invocarlos a través de la forma especial asociada a ellos.

No conozco las funciones globales de doble guión bajo (que no pertenecen a ninguna clase), pero creo que no las hay.

4

Estas son todas las convenciones, por lo que no se aplican de todos modos. Aún así, normalmente puede esperar:

__somename__ 

Algo definido en la propia especificación de lenguaje python. No use esto en su propio nombre.

_somename 

Esto normalmente se supone que se llama a través de algún mecanismo diferente en lugar de hacerlo directamente. Similar a declarar algo privado en la mayoría de los otros idiomas, pero no aplicado de ninguna manera.

__somename 

Esto es realmente no supone que se llama directamente, y está destrozado internamente para dejar de hacerlo accidentalmente. Si realmente necesita llamarlo por algún motivo, consulte la documentación para averiguar cómo.

Cualquiera de los anteriores se puede aplicar por igual a los nombres de funciones, variables o clases.

0

El patrón de __name__ indica métodos "mágicos". Estos son llamados por diversas funciones como

str(x) -> x.__str__() 
repr(x) -> x.__repr__() 
x[0] -> x.__getitem__(0) 
etc 

Un prefijo de subrayado sencillo es indicar un atributo privado, y sólo es seguido a través de convención.

un doble subrayado inicia el nombre-mangling, donde el atributo llamado __attr se cambia a __Class_attr en la creación de instancias.

El patrón que tiene de _method__ no se usa realmente para nada.

19
  • method es sólo un método normal
  • _method no debería ser llamado a menos que sepa lo que está haciendo, lo que normalmente significa que se ha escrito el método mismo.
  • __method los 2 caracteres de subrayado se utilizan para evitar la manipulación de nombres. Atributos o métodos como este son accesibles a través del instance._ClassName__method. Aunque muchas personas lo llaman "privado", es , no. Nunca debe usar esto para evitar que alguien acceda a este método. En su lugar, use _method.
  • __method__ se usa para métodos especiales que modifican el comportamiento de la instancia. No nombre sus propios métodos como este.
Cuestiones relacionadas