L'accès aux attributs d'un objet se fait généralement de cette manière : objet.attribut.
Il arrive cependant que le nom d'un attribut soit stocké dans une variable. C'est là que getattr devient intéressant.
En effet, getattr permet d'accéder aux attributs de manière dynamique en utilisant une chaîne de caractères.
Syntaxe
getattr(objet, attribut, valeur_par_defaut)
-
objetqui contient l'attribut auquel on veut accéder. -
attributà récupérer sous forme de chaîne de caractères. -
valeur_par_defaut(optionnel) à retourner si l'attribut n'existe pas.
Si attribut existe sur l'objet sa valeur est retournée, sinon c'est la valeur_par_defaut qui est retournée. Si aucune valeur par défaut n'est renseignée, l'exception AttributeError est levée.
Utilisation
L'intérêt de getattr est de pouvoir accéder dynamiquement à un attribut dont le nom est déterminé au moment de l'exécution. Prenons un exemple simple qui permet de récupérer la valeur d'une propriété demandée par un utilisateur :
class Utilisateur: def __init__(self, nom, email, pays): self.nom = nom self.email = email self.pays = pays user = Utilisateur("Alice", "[email protected]", "France") # Demander à l'utilisateur quelle information il souhaite voir nom_propriete = input("Quelle information souhaitez-vous afficher (nom, email, pays) ? ") # Utiliser getattr pour récupérer la valeur de manière sécurisée valeur = getattr(user, nom_propriete, "Information non valide") print(f"La valeur de '{nom_propriete}' est : {valeur}")
Si l'utilisateur saisit email, le programme affichera [email protected]. Dans le cas où l'utilisateur entre un attribut inexistant comme age, le programme affichera Information non valide.
Aussi, il est courant de construire dynamiquement le nom des attributs à partir de plusieurs variables :
class Permissions: def __init__(self): self.can_read_admin = True self.can_write_admin = True self.can_delete_admin = True self.can_read_user = True self.can_write_user = False self.can_delete_user = False permissions = Permissions() # Variables déterminées à l'exécution (ex: utilisateur connecté, action demandée) user_role = "admin" action = "write" # On construit le nom de l'attribut dynamiquement permission_name = f"can_{action}_{user_role}" # Donne "can_write_admin" # On utilise getattr pour vérifier la permission can_perform = getattr(permissions, permission_name, False) print(f"L'utilisateur '{user_role}' peut-il effectuer l'action '{action}' ? {can_perform}") # Affiche: L'utilisateur 'admin' peut-il effectuer l'action 'write' ? True user_role = "user" permission_name = f"can_{action}_{user_role}" # Donne "can_write_user" can_perform = getattr(permissions, permission_name, False) print(f"L'utilisateur '{user_role}' peut-il effectuer l'action '{action}' ? {can_perform}") # Affiche: L'utilisateur 'user' peut-il effectuer l'action 'write' ? False