Fundamentos de POO para interfaces gráficas en Python

Instancias de clase

Cada vez que asignamos datos a una variable se está reservando un espacio en la memoria de nuestro ordenador para almacenar ahí su información.

A este proceso de reservar el espacio en la memoria se le conoce como instanciación y podemos comprobar la dirección de memoria de cualquier objeto haciendo uso de un par de funciones de Python:

objetos.py

numero = 10
cadena = "Hola mundo"
lista = [3, 5, 6]

print(hex(id(numero)))
print(hex(id(cadena)))
print(hex(id(lista)))

Evidentemente ocurre lo mismo con los objetos creados con nuestras propias clases:

class Galleta:
    pass


galleta = Galleta()
print(hex(id(galleta)))

Incluso por muy extraño que parezca, la propia definición de la clase existe en la memoria:

print(hex(id(Galleta)))

Y es que si no existieran esas instrucciones no podríamos utilizarlas para crear nuestros objetos, es incluso lógico.

Lo interesante en este punto es que todos los objetos creados a partir de la clase Galleta comparten la misma estructura. Eso no se aprecia porque no hemos definido nada dentro, pero mirad qué ocurre si añadimos un atributo a la clase:

class Galleta:
    sabor = "dulce"


galleta_dulce = Galleta()
print(galleta_dulce.sabor)

galleta_salada = Galleta()
print(galleta_salada.sabor)

galleta_picante = Galleta()
print(galleta_picante.sabor)

Todas nuestras galletas por defecto son dulces, pero eso podemos cambiarlo fácilmente redefiniendo su sabor:

galleta_salada = Galleta()
galleta_salada.sabor = "salada"
print(galleta_salada.sabor)

galleta_picante = Galleta()
galleta_picante.sabor = "picante"
print(galleta_picante.sabor)

¿Interesante verdad? Como cada galleta se almacena en una instancia diferente de la memoria, sus atributos son independientes de las otras y pueden almacenar diferentes valores.

En conclusión, una instancia es un espacio en la memoria donde se almacenan los datos individuales de un objeto tal como define su clase.