Programación Orientada a Objetos · Programación

Atributos, métodos y self

Explicar el rol de self como referencia a la instancia, y distinguir atributos y métodos de objeto frente a atributos y métodos de clase.

Atributos, métodos y self

Ilustracion de programacion orientada a objetos: jerarquia de clases con herencia y encapsulamiento.
Principios de la programacion orientada a objetos: clases, herencia y polimorfismo.

Mapa conceptual

Self: el objeto se reconoce a sí mismo Todo método recibe, sin que lo pidas, una referencia al objeto sobre el que opera: self. Es lo que permite que «ladrar()» sepa qué perro está ladrando.

¿Qué es self?

En Python, self es el nombre por convención del primer parámetro de un método de instancia: representa AL objeto que invoca el método. Cuando llamas mi_perro.ladrar(), Python traduce eso a Perro.ladrar(mi_perro) y pasa el objeto como self. No es mágico, es azúcar de paso de argumento.

Acceder al estado

Dentro de un método, self.nombre lee el atributo de ese objeto concreto, y self.edad = 5 lo escribe. Sin self, no hay forma de distinguir el estado de un objeto del de otro de la misma clase.

__init__ y el constructor

El método __init__ se ejecuta al instanciar: inicializa los atributos del objeto nuevo. Su primer parámetro también es self; los demás son los argumentos con que creaste el objeto. Ahí se «siembra» el estado inicial de cada instancia.

Atributo de instancia vs de clase

La diferencia self vs cls es la de objeto vs plantilla.
ElementoDónde viveAlcanceEjemplo
Atributo de instanciaen selfsolo ese objetoself.nombre
Atributo de claseen la clasecompartidoPerro.especie
Método de instanciarecibe selfopera sobre un objetodef ladrar(self)
Método de claserecibe clsopera sobre la clase@classmethod def contar(cls)

¿Qué representa self dentro de un método de instancia?

El precio de olvidar self

Un error clásico es escribir una variable dentro de un método sin self. entonces: nace una variable local que muere al terminar, no un atributo del objeto. Si quieres guardar algo en el objeto, debe vivir colgado de self.

Mutabilidad compartida

Cuidado con atributos de clase que son listas o diccionarios: todas las instancias comparten el MISMO objeto mutable, y modificarlo desde una lo cambia para todas. Es un bug elegante que atrapa a los principiantes.

mi_perro.ladrar() y Perro.ladrar(mi_perro) son equivalentes en Python.

Encadenar

Como los métodos reciben y pueden devolver el objeto, se pueden encadenar: p.set_nombre(A).set_edad(3). Devolver self permite esta fluidez. No es necesario, pero aparece en librerías de diseño de interfaces.

Errores frecuentes

Asigna cada definición a su tipo:

Instancia
Clase

Documentación de Python
El tutorial oficial sobre clases y el papel de self.

Explica con tus palabras por qué hace falta self y qué pasaría si un método accediera a «nombre» sin self. Muestra un pequeño ejemplo donde la falta de self cause un bug.

Python: Classes
Tutorial oficial de clases en Python 3.