Los atributos con Python son las características que describen a nuestro objeto, pueden ser atributos de instancia y atributos de clase.
Atributos de un objeto
Los atributos de instancia en Python son aquellos que podemos crearlos al vuelo y son independientes para cada instancia de clase, es decir, pueden ser únicos para cada objeto.
class Camisetas:
pass
una_camiseta = Camisetas()
una_consola.marca = 'Salomon'
una_consola.fabricacion = 2022
print(f'La camiseta {una_consola.marca} se fabricó en {una_consola.fabricacion}')
# La camiseta Salomon se fabricó en 2022
Atributos de instancia o dinámicos
Ahora vamos a crear otra instancia de Camisetas pero agregaremos otros algún atributo diferente.
class Camisetas:
pass
otra_camiseta = Camisetas()
otra_camiseta.marca = 'Pryca'
otra_camiseta.color = 'blanca'
print(f'La otra camiseta {otra_camiseta.marca} es de color {otra_camiseta.color}')
# La otra camiseta Pryca es de color blanca
Atributos de clase
Cuando existen atributos que van a existir en todas las instancias de nuestra clase podemos definirlos en la clase directamente.
Por ejemplo, un atributo que existirá en todos nuestros objetos será la marca, independientemente de las características que tengan nuestras camisetas, hemos decidido que todas tendrán el atributo de marca.
Vamos a crear nuestra clase definiendo este atributo como atributo de clase, es decir, dentro de la clase Camisetas y con un valor por defecto ‘sin definir marca’, todos los objetos se van a crear con este atributo de clase, su marca será ‘sin definir marca’.
class Camisetas:
marca = 'sin definir marca'
una_camiseta = Camisetas()
print(f'Camiseta de la marca: {una_camiseta.marca}')
# Camiseta de la marca: sin definir marca
De esta forma nos estamos asegurando que todas las camisetas dispongan del atributo marca, aunque de momento su valor sea que la marca está por definir, luego podemos modificarlo.
Modificando atributo de clase
Cuando modificamos un atributo de clase, todas las instancias que se creen posteriormente pasarán a tener como valor esa modificación. Lo vamos a ver con un ejemplo creando dos camisetas más.
class Camisetas:
marca = 'sin definir marca'
una_camiseta = Camisetas()
print(f'Camiseta de la marca: {una_camiseta.marca}')
# Camiseta de la marca: sin definir marca
Camisetas.marca = 'Salomon'
otra_camiseta = Camisetas()
print(f'Camiseta de la marca: {otra_camiseta.marca}')
# Camiseta de la marca: Salomon
otra_nueva = Camisetas()
print(f'Camiseta de la marca: {otra_nueva.marca}')
# Camiseta de la marca: Salomon
Funciones para los atributos
En Python existen algunas funciones orientadas a trabajar con los atributos de los objetos, vamos a ver algunos ejemplos.
- hasattr() → devuelve True o False si existe el atributo o no.
- getattr() → duelve el valor del atributo.
- setattr() → modifica el valor del atributo.
- delattr() → elimina el atributo.
Función hasattr() Python
Para el primer ejemplo vamos a crear un objeto a partir de una clase, verificaremos si existen determinados atributos haciendo uso de la función hasattr().
class Cliente:
nombre = 'nombre'
apellido1 = 'apellido1'
cliente_01 = Cliente()
print(hasattr(cliente_01, 'nombre'))
# True
print(hasattr(cliente_01, 'apellido2'))
# False
Función getattr() Python
Sabiendo que el atributo nombre existe, verificaremos su valor con la función getattr(), si el nombre es Pedro, que será el que evaluaremos mediante la estructura if, indicaremos ‘Correcto’, si no ‘Incorrecto!’.
class Cliente:
nombre = 'Pedro'
apellido1 = 'Gómez'
cliente_01 = Cliente()
if getattr(cliente_01, 'nombre') == 'Pedro':
print('Correcto!')
else:
print('Incorrecto!')
# Correcto!
Podemos incluir un tercer parámetro opcional al llamar a la función y será lo que nos devuelva en caso de no existir el parámetro. Vamos a ver un ejemplo con la misma clase de antes, pero si no existe el parámetro que busquemos nos dirá ‘XX’ por ejemplo
class Cliente:
nombre = 'Pedro'
apellido1 = 'Gómez'
cliente_01 = Cliente()
print(getattr(cliente_01, 'edad', 'XX')
# XX
Función setattr() Python
Ahora haremos uso de la función setattr() para modificar el valor del apellido1, vamos a modificar un atributo que sepamos que existe y otro que no exista para ver qué pasa.
class Cliente:
nombre = 'Pedro'
apellido1 = 'Gómez'
cliente_01 = Cliente()
setattr(cliente_01, 'apellido1', 'Fernández')
setattr(cliente_01, 'apellido2', 'Estrella')
print(cliente_01.apellido1)
# Fernández
print(cliente_01.apellido2)
# Estrella
Como puedes ver, si el atributo existe se modifica correctamente, pero si no existe se crea el atributo nuevo y asigna el valor que hayamos indicado.
Función delattr() Python
Con la función delattr() podemos eliminar atributos de nuestro objeto.
class Cliente:
pass
def __init__(self, nombre, apellido1):
self.nombre = nombre
self.apellido1 = apellido1
cliente_01 = Cliente('Luis', 'Gómez')
print(cliente_01.nombre)
print(cliente_01.apellido1)
# Luis
# Gómez
delattr(cliente_01, 'nombre')
print(cliente_01.nombre)
# AttributeError: 'Cliente' object has no attribute 'nombre'