Diferencia entre “__method__” y “method”

¿Cuál es la diferencia entre __method__ , method y _method__ ?

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

  • __method : método privado.
  • __method__ : método especial de Python. Se nombran así para evitar colisiones de nombres. Consulte esta página para obtener una lista de estos métodos especiales.
  • _method : esta es la convención de nomenclatura recomendada para métodos protegidos en la guía de estilo de Python .

De la guía de estilo:

  • _single_leading_underscore : _single_leading_underscore débil de “uso interno”. Por ejemplo, from M import * no se importan objetos cuyo nombre comience con un guión bajo.

  • single_trailing_underscore_ : utilizado por la convención para evitar conflictos con la palabra clave Python, por ejemplo

     Tkinter.Toplevel(master, class_='ClassName') 
  • __double_leading_underscore : al nombrar un atributo de clase, invoca la manipulación de nombres (dentro de la clase FooBar , __boo se convierte en _FooBar__boo ; ver más abajo).

  • __double_leading_and_trailing_underscore__ : objetos o atributos “mágicos” que viven en espacios de nombres controlados por el usuario. Por __init__ , __init__ , __import__ o __file__ . Nunca inventes tales nombres; Utilícelos únicamente como se documenta.

  • method es solo un método normal
  • _method debe _method , a menos que sepa lo que está haciendo, lo que normalmente significa que usted mismo ha escrito el método.
  • __method los 2 guiones bajos se utilizan para evitar la manipulación de nombres. Los atributos o métodos como este son accesibles a través de instance._ClassName__method . Aunque mucha gente llama a esto “privado” no lo es. Nunca debe usar esto para evitar que alguien acceda a este método, use _method en _method lugar.
  • __method__ se utiliza para métodos especiales que modifican el comportamiento de la instancia. No nombre sus propios métodos como este.

Estas son todas las convenciones, por lo que no se aplican de ninguna manera. Aún así, normalmente puedes esperar:

 __somename__ 

Algo definido en la propia especificación del lenguaje python. No uses esto en tu propio nombre.

 _somename 

Normalmente se supone que esto se debe llamar 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 se aplica de ninguna manera.

 __somename 

Esto realmente no debe llamarse directamente, y está mutilado internamente para evitar que lo haga accidentalmente. Si realmente necesita llamarlo por algún motivo, consulte la documentación para averiguar cómo.

Cualquiera de los anteriores puede aplicarse igualmente a los nombres de funciones, variables o clases.

Estos métodos fueron nombrados como tales para reducir la posibilidad de nombrar colisiones.

Los métodos precedidos y prefijados con el subrayado doble están generalmente marcados para indicar que forman parte de la especificación del lenguaje Python.

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

No sé sobre funciones globales con doble guión bajo (que no pertenezcan a ninguna clase), pero creo que no hay ninguna.

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 único prefijo de subrayado es para indicar un atributo privado, y solo se sigue a través de una convención.

un prefijo de subrayado doble inicia la manipulación de nombres, donde el atributo llamado __attr se cambia a __Class_attr en la instanciación.

El patrón que tienes de _método__ no se usa para nada.