Los atributos con Python son las características que describen 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 crear 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 un atributo diferente. Sustituiremos el atributo fabricacion por color.
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 algún atributo va 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 y 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 de 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 si existe el atributo o False si no existe.
- 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 y, haciendo uso de la función hasattr(), verificaremos si existen determinados atributos.
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óngetattr(). 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!
Si incluimos un tercer parámetro al llamar a la función, nos lo devolverá en caso de que no exista dicho parámetro. Vamos a ver un ejemplo con la misma clase de antes. Como el tercer parámetro que enviamos no existe, nos lo devuelve; en este caso ‘XX’.
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 de apellido1. Para ello modificaremos 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 vemos, si el atributo existe, se modifica correctamente; pero, si no, 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'