À quoi sert la fonction getattr ?

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)
  • objet qui 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}")
Un instant

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
Un instant

L'utilisation des fstring démontre bien la flexibilité de getattr.

Nous pouvons ajouter un nouveau rôle ou une nouvelle action dans la classe, sans avoir besoin de modifier la logique.

Le code peut donc s'adapter à des configurations qui ne sont pas connues à l'avance. 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.