La fonction setattr permet d'assigner ou de mettre à jour la valeur d'un attribut en utilisant son nom sous forme de chaîne de caractères.
Une fonction très pratique lorsque le nom de l'attribut à modifier est déterminé pendant l'exécution du programme.
Syntaxe
setattr(objet, attribut, valeur)
-
objetdont l'attribut doit être ajouté ou modifié -
attributest l'attribut à définir ou à mettre à jour (chaîne de caractères) -
valeurqui sera assignée à l'attribut
setattr retourne None.
Utilisation
setattr permet de modifier dynamiquement un attribut :
class Produit: def __init__(self, nom, prix): self.nom = nom self.prix = prix p = Produit("Ordinateur", 1200) # Assignation directe p.prix = 1300 p.stock = 50 # Ajoute un nouvel attribut # Assignation avec setattr setattr(p, 'prix', 1400) # Met à jour un attribut existant setattr(p, 'en_promotion', True) # Ajoute un nouvel attribut print(p.prix) # Affiche: 1400 print(p.stock) # Affiche: 50 print(p.en_promotion) # Affiche: True
L'assignation directe et l'utilisation de setattr produisent le même résultat, mais setattr permet l'utilisation d'une variable.
Prenons un autre exemple où le programme doit recevoir des données sous forme d'un dictionnaire, alors que l'on ne connaît pas à l'avance les champs qui seront modifiés :
class Utilisateur: def __init__(self, nom, email): self.nom = nom self.email = email self.ville = "Non spécifiée" user = Utilisateur("Bob", "[email protected]") donnees_a_mettre_a_jour = { "email": "[email protected]", "ville": "Paris", "statut": "Actif" # Un attribut qui n'existait pas } # On parcourt le dictionnaire et on met à jour l'objet dynamiquement for cle, valeur in donnees_a_mettre_a_jour.items(): setattr(user, cle, valeur) print(f"Email: {user.email}") # Email: [email protected] print(f"Ville: {user.ville}") # Ville: Paris print(f"Statut: {user.statut}") # Statut: Actif
Quelles que soient les clés présentes dans le dictionnaire, si les attributs n'existent pas ils seront créés, s'ils existent ils seront mis à jour.
On peut même imaginer un scénario où c'est l'utilisateur lui-même qui choisit le champ à modifier :
class Utilisateur: def __init__(self, nom, email): self.nom = nom self.email = email self.ville = "Non spécifiée" user = Utilisateur("Claire", "[email protected]") attribut_a_changer = input("Quel attribut voulez-vous modifier (nom, email, ville) ? ") nouvelle_valeur = input(f"Entrez la nouvelle valeur pour '{attribut_a_changer}' : ") # Par sécurité, on peut vérifier si l'attribut existe avant de le modifier if hasattr(user, attribut_a_changer): setattr(user, attribut_a_changer, nouvelle_valeur) print(f"\nL'attribut '{attribut_a_changer}' a été mis à jour.") print(f"Nom: {user.nom}, Email: {user.email}, Ville: {user.ville}") else: print(f"\nL'attribut '{attribut_a_changer}' n'est pas valide.")