property programacion orientada objetos ejemplos python self

python - programacion - property decorator django



¿Cuándo usas ''self'' en Python? (4)

  1. No hay nada ''especial'' sobre el nombre self . Es el nombre preferido por los pitonistas por convención, para indicar qué se espera que contenga ese parámetro.

  2. El tiempo de ejecución de Python pasará un valor ''self'' cuando llame a un método de instancia en una instancia, ya sea que lo proporcione deliberadamente o no. Esto generalmente resultará en un error fácil de diagnosticar / entender (ya que la función se llamará con un número de parámetros incorrecto), pero el uso de *args puede llevar a errores de tipo bastante más extraños.

  3. El parámetro se pasa implícitamente cuando llama a un método de instancia en una instancia. Contiene la instancia sobre la que se llama el método. Por lo tanto, no se menciona a self en la llamada a la función porque (a) como se señaló anteriormente, eso no tendría ningún sentido (no hay un self en el alcance, en general, y el self no es una palabra clave o un nombre especial ni nada ); (b) ya ha indicado la instancia a usar (escribiendo my_instance. ).

  4. Por supuesto, puede llamar explícitamente a un método de instancia accediendo a él desde la clase. En este caso, deberá pasar la instancia explícitamente como primer parámetro. En general, no quieres hacer esto. Y, especialmente , no desea escribir código que considere la posibilidad de que el primer parámetro sea algo que se haya pasado explícitamente de esta manera. Esto es similar a verificar if (this == null) en C ++: no lo hace, porque si es posible que signifique algo , entonces el código de llamada es incorrecto , moralmente, si no legalmente. (Al menos en Python no tendrás problemas con un comportamiento indefinido, pero sigue siendo moralmente incorrecto).

  5. Dentro del método de instancia, dado que self es un parámetro al que se le ha asignado la instancia como un valor, puede escribir self.whatever para acceder a los atributos de la instancia. A diferencia de otros lenguajes de estilo ''implícito this '', los nombres de los atributos no están implícitamente "en el alcance".

  6. No hay otros casos de uso para self , ya que de nuevo no es un nombre especial, y ese es el único propósito específico que aborda la convención de nombres. Si necesitara acceder a una ''variable'' (en realidad un atributo) desde otro módulo, usaría el nombre del módulo. Si desea acceder a uno desde el módulo actual, no se necesita ningún prefijo, o realmente es posible. (Bueno, puedes buscarlo explícitamente en el dict por globals() , pero no hagas eso).

¿Se supone que debes usar self cuando haces referencia a una función miembro en Python (dentro del mismo módulo)?

En términos más generales, me preguntaba cuándo es necesario usar self , no solo para los métodos, sino también para las variables.


Agregar una respuesta porque Oskarbi no es explícito.

Usas el self cuando:

  1. Definiendo un método de instancia. Se pasa automáticamente como el primer parámetro cuando llama a un método en una instancia, y es la instancia en la que se llamó al método.
  2. Hacer referencia a un atributo de clase o instancia desde dentro de un método de instancia. Úselo para llamar a un método o acceder a un nombre (variable) en la instancia en la que se invocó el método, desde dentro de ese método.

No usas el self cuando

  1. Normalmente llamas a un método de instancia. Usando el ejemplo de Oskarbi, si haces instance = MyClass() , llamas a MyClass.my_method como instance.my_method(some_var) no como instance.my_method(self, some_var) .
  2. Hace referencia a un atributo de clase desde fuera de un método de instancia pero dentro de la definición de clase.
  3. Estás dentro de un staticmethod .

Estos no son solo ejemplos de cuándo no usar uno mismo. Las dos son cuando debes usarlo.


Por ejemplo, la variable y los métodos son obligatorios para usar uno mismo en cualquier momento.


Use self para referirse a variables de instancia y métodos de otros métodos de instancia. También se pone a self como el primer parámetro en la definición de los métodos de instancia.

Un ejemplo:

class MyClass(object): my_var = None def my_method(self, my_var): self.my_var = my_var self.my_other_method() def my_other_method(self): # do something...