python - programacion - property decorator django
¿Cuándo usas ''self'' en Python? (4)
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.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.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 unself
en el alcance, en general, y elself
no es una palabra clave o un nombre especial ni nada ); (b) ya ha indicado la instancia a usar (escribiendomy_instance.
).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).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 escribirself.whatever
para acceder a los atributos de la instancia. A diferencia de otros lenguajes de estilo ''implícitothis
'', los nombres de los atributos no están implícitamente "en el alcance".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 eldict
porglobals()
, 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:
- 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.
- 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
- Normalmente llamas a un método de instancia. Usando el ejemplo de Oskarbi, si haces
instance = MyClass()
, llamas aMyClass.my_method
comoinstance.my_method(some_var)
no comoinstance.my_method(self, some_var)
. - Hace referencia a un atributo de clase desde fuera de un método de instancia pero dentro de la definición de clase.
- 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...