getattr()

Lit un attribut d’un objet à partir d’un nom donné sous forme de chaîne, avec éventuellement une valeur par défaut.

Renvoie
La valeur de l’attribut, ou default.
Sur cette page

Exemple

#
Python
class Student:
    def __init__(self, name, points):
        self.name = name
        self.points = points

lea = Student("Léa", 250)

print(getattr(lea, "points"))
print(getattr(lea, "level", 1))

for field in ["name", "points"]:
    print(field, "=", getattr(lea, field))
Résultatrésultat enregistré, vous pouvez le vérifier
250
1
name = Léa
points = 250

Définition et utilisation

#

La fonction getattr(object, "name") fonctionne comme l’écriture object.name, mais vous donnez le nom de l’attribut sous forme de chaîne. Cela permet de choisir l’attribut seulement pendant l’exécution du programme, par exemple à partir de données d’un fichier, de paramètres, ou d’une commande saisie par l’utilisateur.

Quand l’attribut n’existe pas, getattr() lève une AttributeError. Avec un troisième argument, elle renvoie à la place une valeur par défaut, ce qui est utile pour des champs optionnels. Vous pouvez lire une méthode de la même façon : getattr(object, "save") renvoie la méthode, que vous appelez ensuite avec des parenthèses.

Les fonctions voisines sont hasattr() (l’attribut existe-t-il), setattr() (écrire un attribut par son nom) et delattr() (supprimer un attribut). Ne les utilisez pas là où un simple point ou un dictionnaire suffit : un code basé sur des noms stockés dans des chaînes est plus difficile à lire, et l’éditeur n’y détecte pas les fautes de frappe.

Syntaxe

#
Syntaxe
getattr(object, name)
getattr(object, name, default)

Paramètres

#
  • object

    n’importe quel objet

    L’objet dont vous lisez l’attribut. Cela peut aussi être une classe ou un module.
  • name

    str

    Le nom de l’attribut ou de la méthode.
  • default

    optionnel

    La valeur renvoyée quand l’attribut n’existe pas. Sans elle, AttributeError est levée.

Plus d’exemples

#
Choisir une méthode par son nom
Python
class Robot:
    def forward(self):
        return "J’avance"

    def left(self):
        return "Je tourne à gauche"

robot = Robot()
for command in ["forward", "left", "jump"]:
    action = getattr(robot, command, None)
    print(action() if action else f"Commande inconnue : {command}")
Résultatrésultat enregistré, vous pouvez le vérifier
J’avance
Je tourne à gauche
Commande inconnue : jump
setattr() et un attribut manquant
Python
class Settings:
    pass

settings = Settings()
for key, value in {"theme": "dark", "lang": "fr"}.items():
    setattr(settings, key, value)

print(settings.theme, settings.lang)

try:
    getattr(settings, "font")
except AttributeError as error:
    print(error)
Résultatrésultat enregistré, vous pouvez le vérifier
dark fr
'Settings' object has no attribute 'font'

Bonnes pratiques

#
  • N’utilisez getattr() que lorsque le nom de l’attribut n’est vraiment connu qu’à l’exécution. Dans les autres cas, écrivez objet.attribut.
  • Quand le nom d’une méthode vient de l’utilisateur, vérifiez-le par rapport à une liste de commandes autorisées, pour qu’il ne soit pas possible d’appeler une méthode que vous n’avez pas prévue.
  • La fonction fonctionne aussi avec les modules : getattr(math, "sqrt")(16) renvoie 4.0.

Entrées associées

#

Vous voyez une erreur ou il manque un exemple ? Écrivez-nous.