À quoi sert la fonction setattr ?

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)
  • objet dont l'attribut doit être ajouté ou modifié

  • attribut est l'attribut à définir ou à mettre à jour (chaîne de caractères)

  • valeur qui 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
Un instant

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

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.")

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.