Avant d'utiliser un attribut, il peut être nécessaire de vérifier si un objet le possède. La fonction hasattr permet de vérifier si un objet possède un attribut.
On peut faire le parallèle avec le principe "Look Before You Leap" (LBYL), qui consiste à vérifier les conditions avant d'exécuter une action.
Syntaxe
hasattr(objet, attribut)
-
objetque l'on veut inspecter -
attributà vérifier (chaîne de caractères)
La fonction retourne True ou False en fonction de si l'attribut est présent ou non.
Utilisation
L'utilisation la plus courante de hasattr est de vérifier l'existence d'un attribut avant d'y accéder. Ce qui permet d'éviter une AttributeError lorsqu'on manipule des objets dont on n'est pas certain de leur structure.
class Produit: def __init__(self, nom, prix): self.nom = nom self.prix = prix # La réduction n'est pas toujours présente if prix > 50: self.reduction = 0.10 # 10% produit_luxe = Produit("Parfum", 80) produit_standard = Produit("Savon", 5) def afficher_details(produit): print(f"Produit : {produit.nom}, Prix : {produit.prix}€") # On vérifie si l'attribut 'reduction' existe avant de l'utiliser if hasattr(produit, 'reduction'): prix_reduit = produit.prix * (1 - produit.reduction) print(f" -> Prix avec réduction : {prix_reduit:.2f}€") afficher_details(produit_luxe) # Affiche : # Produit : Parfum, Prix : 80€ # -> Prix avec réduction : 72.00€ afficher_details(produit_standard) # Affiche : # Produit : Savon, Prix : 5€
Sans hasattr, l'appel à la fonction afficher_details(produit_standard) aurait provoqué une AttributeError.
À noter
Pour la suite du glossaire, je vous invite à lire le glossaire sur setattr.
Il est courant de vérifier dynamiquement la présence d'attributs :
class Utilisateur: def __init__(self, nom, permissions=None): self.nom = nom if permissions: for perm in permissions: # On utilise setattr pour créer dynamiquement les attributs setattr(self, f"peut_{perm}", True) # Création d'utilisateurs avec des permissions différentes admin = Utilisateur("Alice", permissions=["modifier", "supprimer"]) editeur = Utilisateur("Bob", permissions=["modifier"]) # L'action à vérifier est demandée à l'utilisateur action_requise = input("Quelle action vérifier (ex: modifier, supprimer) ? ") permission_a_verifier = f"peut_{action_requise}" # Construit dynamiquement "peut_supprimer", "peut_modifier", etc. def peut_executer(user, permission): # On utilise la variable 'permission' pour vérifier l'attribut if hasattr(user, permission): print(f"Oui, {user.nom} a la permission : '{permission}'") else: print(f"Non, {user.nom} n'a PAS la permission : '{permission}'") peut_executer(admin, permission_a_verifier) peut_executer(editeur, permission_a_verifier) # Si l'utilisateur saisit "supprimer", le programme affiche : # Oui, Alice a la permission : 'peut_supprimer' # Non, Bob n'a PAS la permission : 'peut_supprimer'
La variable permission_a_verifier contient le nom de l'attribut à tester.