Variables de instancia
En general, una clase puede equiparse con dos tipos diferentes de datos para formar las propiedades de una clase. Ya viste uno de ellos cuando estábamos estudiando pilas.
Este tipo de propiedad existe solo cuando se crea explícitamente y se agrega a un objeto. Como ya sabes, esto se puede hacer durante la inicialización del objeto, realizada por el constructor.
Además, se puede hacer en cualquier momento de la vida del objeto. Es importante mencionar también que cualquier propiedad existente se puede eliminar en cualquier momento.
Tal enfoque tiene algunas consecuencias importantes:
- Diferentes objetos de la misma clase pueden poseer diferentes conjuntos de propiedades.
- Debe haber una manera de verificar con seguridad si un objeto específico posee la propiedad que deseas utilizar (a menos que quieras provocar una excepción, siempre vale la pena considerarlo).
- Cada objeto lleva su propio conjunto de propiedades - no interfieren entre sí de ninguna manera.
Tales variables (propiedades) se llaman variables de instancia.
La palabra instancia sugiere que están estrechamente conectadas a los objetos (que son instancias de clase), no a las clases mismas. Echemos un vistazo más de cerca a ellas.
Aquí hay un ejemplo:
class ClaseEjemplo:
def __init__(self, val = 1):
self.primera = val
def setSegunda(self, val):
self.segunda = val
objetoEjemplo1 = ClaseEjemplo()
objetoEjemplo2 = ClaseEjemplo(2)
objetoEjemplo2.setSegunda(3)
objetoEjemplo3 = ClaseEjemplo(4)
objetoEjemplo3.tercera = 5
print(objetoEjemplo1.__dict__)
print(objetoEjemplo2.__dict__)
print(objetoEjemplo3.__dict__)
Se necesita una explicación adicional antes de entrar en más detalles. Echa un vistazo a las últimas tres líneas del código.
Los objetos de Python, cuando se crean, están dotados de un pequeño conjunto de propiedades y métodos predefinidos. Cada objeto los tiene, los quieras o no. Uno de ellos es una variable llamada __dict__
(es un diccionario).
La variable contiene los nombres y valores de todas las propiedades (variables) que el objeto contiene actualmente. Vamos a usarla para presentar de forma segura el contenido de un objeto.
Vamos a sumergirnos en el código ahora:
- La clase llamada
ClaseEjemplo
tiene un constructor, el cual crea incondicionalmente una variable de instancia llamadaprimera
, y le asigna el valor pasado a través del primer argumento (desde la perspectiva del usuario de la clase) o el segundo argumento (desde la perspectiva del constructor); ten en cuenta el valor predeterminado del parámetro: cualquier cosa que puedas hacer con un parámetro de función regular también se puede aplicar a los métodos. - La clase también tiene un método que crea otra variable de instancia, llamada
segunda
. - Hemos creado tres objetos de la clase
ClaseEjemplo
, pero todas estas instancias difieren: objetoEjemplo1
solo tiene una propiedad llamadaprimera
.objetoEjemplo2
tiene dos propiedades:primera
ysegunda
.objetoEjemplo3
ha sido enriquecido sobre la marcha con una propiedad llamadatercera
, fuera del código de la clase: esto es posible y totalmente permisible.
La salida del programa muestra claramente que nuestras suposiciones son correctas: aquí están:
{'primera': 1}
{'primera': 2, 'segunda': 3}
{'primera': 4, 'tercera': 5}
Hay una conclusión adicional que debería mencionarse aquí: el modificar una variable de instancia de cualquier objeto no tiene impacto en todos los objetos restantes. Las variables de instancia están perfectamente aisladas unas de otras.