Introducción
En este laboratorio (lab), aprenderás cómo verificar si una clase tiene un atributo específico en Python. El laboratorio se centra en comprender los atributos de clase, que son variables compartidas por todas las instancias de una clase, y en diferenciarlos de los atributos de instancia.
El laboratorio te guía a través de la creación de una clase Dog con un atributo de clase species y atributos de instancia name y age. Aprenderás a acceder a ambos tipos de atributos y a observar cómo modificar un atributo de clase afecta a todas las instancias. Luego, el laboratorio presentará y utilizará las funciones hasattr() y getattr() para comprobar y acceder de forma segura a los atributos dentro de una clase.
Comprender los atributos de clase
En este paso, aprenderás sobre los atributos de clase en Python. Los atributos de clase son variables que se definen dentro de una clase y son compartidas por todas las instancias (objetos) de esa clase. Son diferentes de los atributos de instancia, que son específicos de cada instancia. Comprender los atributos de clase es crucial para diseñar clases eficientes y organizadas.
Empecemos creando una clase simple con un atributo de clase:
Abre tu editor de VS Code.
Crea un nuevo archivo llamado
class_attributes.pyen el directorio~/project.~/project/class_attributes.pyAñade el siguiente código al archivo
class_attributes.py:class Dog: species = "Canis familiaris" def __init__(self, name, age): self.name = name self.age = age ## Creating instances of the Dog class dog1 = Dog("Buddy", 3) dog2 = Dog("Lucy", 5) ## Accessing the class attribute print(dog1.species) print(dog2.species) ## Accessing instance attributes print(dog1.name) print(dog2.name)En este ejemplo,
specieses un atributo de clase porque se define dentro de la claseDogpero fuera de cualquier método.nameyageson atributos de instancia porque se definen dentro del método__init__y son específicos de cada instancia deDog.Ejecuta el script
class_attributes.pyutilizando el siguiente comando en la terminal:python class_attributes.pyDeberías ver la siguiente salida:
Canis familiaris Canis familiaris Buddy LucyComo puedes ver, tanto
dog1comodog2comparten el mismo valor despecies, que es "Canis familiaris". Sin embargo, tienen diferentes valores denameporquenamees un atributo de instancia.Ahora, modifiquemos el atributo de clase y veamos cómo afecta a las instancias:
class Dog: species = "Canis familiaris" def __init__(self, name, age): self.name = name self.age = age ## Creating instances of the Dog class dog1 = Dog("Buddy", 3) dog2 = Dog("Lucy", 5) ## Accessing the class attribute print(dog1.species) print(dog2.species) ## Modifying the class attribute Dog.species = "New Species" ## Accessing the class attribute again print(dog1.species) print(dog2.species)Ejecuta el script
class_attributes.pyde nuevo:python class_attributes.pyDeberías ver la siguiente salida:
Canis familiaris Canis familiaris New Species New SpeciesObserva que cuando modificamos
Dog.species, el cambio se refleja en tantodog1comodog2porque comparten el mismo atributo de clase.
Este ejemplo demuestra el concepto básico de los atributos de clase. Son compartidos entre todas las instancias de una clase y se pueden modificar accediendo directamente a la clase.
Usar hasattr() en la clase
En este paso, aprenderás cómo usar la función hasattr() en Python para verificar si una clase o un objeto tiene un atributo específico. Esta función es útil para determinar si un atributo existe antes de intentar acceder a él, lo que puede prevenir errores y hacer tu código más robusto.
A partir del ejemplo anterior, usemos hasattr() para comprobar la existencia de atributos de clase y de instancia en la clase Dog:
Abre el archivo
class_attributes.pyen tu editor de VS Code (el mismo archivo que creaste en el paso anterior).~/project/class_attributes.pyModifica el código para incluir comprobaciones con
hasattr()de la siguiente manera:class Dog: species = "Canis familiaris" def __init__(self, name, age): self.name = name self.age = age ## Creating an instance of the Dog class dog1 = Dog("Buddy", 3) ## Checking for the existence of class attributes print(hasattr(Dog, "species")) print(hasattr(Dog, "breed")) ## Checking for the existence of instance attributes print(hasattr(dog1, "name")) print(hasattr(dog1, "age")) print(hasattr(dog1, "breed"))En este código, usamos
hasattr()para comprobar si la claseDogtiene los atributosspeciesybreed, y si la instanciadog1tiene los atributosname,ageybreed.Ejecuta el script
class_attributes.pyutilizando el siguiente comando en la terminal:python class_attributes.pyDeberías ver la siguiente salida:
True False True True FalseLa salida muestra que la clase
Dogtiene el atributospecies(True) pero no el atributobreed(False). Del mismo modo, la instanciadog1tiene los atributosnameyage(True) pero no el atributobreed(False).
hasattr() devuelve True si el atributo existe y False en caso contrario. Esto te permite escribir código condicional que maneje diferentes casos en función de la presencia de atributos. Por ejemplo, podrías querer proporcionar un valor predeterminado si un atributo falta.
Este ejemplo demuestra cómo usar hasattr() para comprobar la existencia de atributos en una clase y sus instancias. Esta es una técnica útil para escribir código más flexible y robusto.
Acceder de forma segura con getattr()
En este paso, aprenderás cómo usar la función getattr() en Python para acceder de forma segura a los atributos de una clase o un objeto. La función getattr() te permite proporcionar un valor predeterminado si el atributo no existe, evitando excepciones de AttributeError y haciendo tu código más robusto.
Continuando con el ejemplo de la clase Dog, usemos getattr() para acceder al atributo breed, del que sabemos que podría no existir:
Abre el archivo
class_attributes.pyen tu editor de VS Code (el mismo archivo que has estado usando en los pasos anteriores).~/project/class_attributes.pyModifica el código para incluir
getattr()para acceder de forma segura al atributobreed:class Dog: species = "Canis familiaris" def __init__(self, name, age): self.name = name self.age = age ## Creating an instance of the Dog class dog1 = Dog("Buddy", 3) ## Safely accessing the 'breed' attribute using getattr() breed = getattr(dog1, "breed", "Unknown") print(breed) ## Accessing existing attributes print(getattr(dog1, "name"))En este código, usamos
getattr(dog1, "breed", "Unknown")para intentar acceder al atributobreedde la instanciadog1. Si el atributobreedno existe,getattr()devolverá el valor predeterminado "Unknown". También accedemos al atributonameexistente usandogetattr().Ejecuta el script
class_attributes.pyutilizando el siguiente comando en la terminal:python class_attributes.pyDeberías ver la siguiente salida:
Unknown BuddyLa salida muestra que, dado que el atributo
breedno existe,getattr()devolvió el valor predeterminado "Unknown". El atributonamese accede correctamente usandogetattr().
Al usar getattr() con un valor predeterminado, puedes evitar excepciones de AttributeError y manejar casos en los que un atributo podría faltar. Esto hace que tu código sea más resistente y más fácil de mantener.
Este ejemplo demuestra cómo usar getattr() para acceder de forma segura a los atributos en una clase y sus instancias. Esta es una técnica valiosa para escribir código más robusto y flexible.
Resumen
En este laboratorio, aprendiste sobre los atributos de clase en Python, que son variables definidas dentro de una clase y compartidas por todas las instancias. Creaste una clase Dog con un atributo de clase species y atributos de instancia name y age. Observaste que todas las instancias de la clase Dog comparten el mismo valor para el atributo species, mientras que cada instancia tiene sus propios valores únicos para los atributos name y age.
También ejecutaste el script class_attributes.py y verificaste la salida, confirmando que los atributos de clase se acceden de la misma manera que los atributos de instancia, pero se comparten entre todas las instancias de la clase.



