À quoi sert la fonction hasattr ?

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)
  • objet que 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€
PYTHON
Un instant

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'
PYTHON

La variable permission_a_verifier contient le nom de l'attribut à tester.

Vous pouvez aussi consulter nos glossaires sur :

Bravo, tu es prêt à passer à la suite

Rechercher sur le site

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.