Accéder aux attributs d’une classe en Python est possible grâce à des fonctions natives qui viennent avec Python. Ces fonctions sont utilisées pour vérifier et modifier les propriétés d’un programme au moment de l’exécution. Nous allons voir les fonctions intégrées à Python hasattr()
, getattr()
, setattr()
et delattr()
.

La fonction hasattr()
Parfois, nous pouvons rencontrer des situations dans lesquelles nous devons vérifier l’existance d’un attribut dans une classe. En fait, la méthode Python hasattr()
permet de le faire.
La méthode hasattr()
renvoie True
si l’objet contient l’attribut donné comme paramètre, sinon, elle renvoie False
. Donc, elle prend le nom de l’objet et l’attribut à vérifier comme paramètres.
hasattr(objet, attribut)
class Personne:
nom = "Jack"
age = 42
print("Est ce que l'objet Personne possède un attribut 'age':", hasattr(Personne, 'age'))
L’exécution du code.
Est ce que l‘objet Personne possède un attribut ‘age‘: True
L’accès aux attribut et l’espace de noms
Restons avec notre classe Personne
avec deux attributs nom
et age
.
class Personne:
nom = "Jack"
age = 42
Vérifions l’espace de nom de la classe Personne
.
print(Personne.__dict__)
{'__module__': '__main__', 'nom': 'Jack', 'age': 42, '__dict__': <attribute '__dict__' of 'Personne' objects>, '__weakref__': <attribute '__weakref__' of 'Personne' objects>, '__doc__': None}
Nous allons récupérer la liste des clés de la classe.
print(list(Personne.__dict__.keys()))
['__module__', 'nom', 'age', '__dict__', '__weakref__', '__doc__']
Utilisons un générateur de liste pour exclure les méthodes spéciales.
print(list(n for n in Personne.__dict__ if not n.startswith('__')))
['nom', 'age']
Créons une instance x
avec la classe Personne
.
x = Personne()
print(x.nom)
Jack
Essayons à présent d’accéder à l’attribut nom avec __dict__
.
print(x.__dict__['nom'])
KeyError: 'nom'
En fait, lors de l’instanciation d’un objet, son espace de nom est vide. L’attribut nom
appartient à l’espace de nom de la classe Personne
.
print(x.__dict__)
{}
Et :
print(Personne.__dict__['nom'])
Jack
Un attribut peut souvent être récupéré soit par l’indexation du dictionnaire, soit par la notation objet.attribut
, mais uniquement s’il est présent dans l’objet en question. Cependant, la notation objet.attribut
lance la recherche d’héritage, mais l’indexation ne porte que sur l’objet en question.
Pour faciliter la recherche d’attributs avec l’héritage, chaque instance possède un lien vers sa classe que Python crée – il s’agit de __class__
.
print(x.__class__)
<class '__main__.Personne'>
De plus, les classes possède un attribut __bases__
, qui est un tuple contenant des références vers les superclasses.
print(Personne.__bases__)
(<class 'object'>,)
En effet, ces deux derniers attributs sont la façon dont les classes sont représentés en mémoire par Python.
Une dernière chose à noter est que les instances de la même classe sont en réalité des espaces de noms distincts, donc chacun a un dictionnaire d’attributs distinct.
La fonction getattr()
Nous pouvons accéder aux attributs d’une classe en utilisant la méthode getattr()
. Elle renvoie la valeur de l’attribut donné comme paramètre avec un objet. S’il n’est pas trouvé, il renvoie la valeur par défaut fournie à la fonction.
La syntaxe est la suivante :
getattr (objet, attribut, attribut_par_défaut)
Ce qui est équivaut à :
objet.attribut
En fait, attribut_par_défaut
est la valeur renvoyée par défaut lorsque l’attribut donné comme paramètre n’est pas trouvé. L’attribut par défaut est facultatif. Cependant, si l’attribut donné comme paramètre n’est pas trouvé et l’attribut par défaut n’est pas défini, vous aurez une AttributeError
.
Restons avec notre classe Personne
.
# Accéder à l'attribut nom
print(getattr(Personne, 'nom'))
# Accéder à l'attribut profession qui n'existe pas
# définir un attribut par défaut
print(getattr(Personne, 'profession', f"{Personne.nom} est sans profession."))
L’exécution du code.
Jack
Jack est sans profession.
Essayons à présent d’accéder à un attribut inexistant en l’absence de l’attribut par défaut.
# Accéder à un attribut inexistant
print(getattr(Personne, 'salaire'))
L’exécution du code.
AttributeError: type object 'Personne' has no attribute 'salaire'
Mais, si getattr(objet, attribut)
équivaut objet.attribut
, pourquoi l’utilise-t-on ?
La principale raison pour laquelle nous utilisons la fonction getattr()
pour accéder à un attribut est que nous pouvons récupérer la valeur en utilisant le nom de l’attribut comme chaîne de caractère. Vous pouvez donc saisir manuellement le nom de l’attribut dans votre programme à partir de la console.
L’instruction utilisant la notation par points n’est pas utile si le nom de l’attribut n’est pas défini au moment de l’appel.
Donc, si la structure de l’objet change de temps en temps, vous pouvez utiliser getattr()
pour vérifier si l’objet est dans un état particulier.
De plus, getattr()
nous permet de gérer facilement les exceptions et nous fournit des valeurs par défaut en cas ou elle ne trouve pas l’attribut. Aussi, sachez qu’en cas de problème, nous pouvons intercepter l’exception AttributeError
ou renvoyer la valeur par défaut.
En fait, si notre classe est en cours, nous pouvons utiliser la fonction getattr()
pour compléter un autre code. Une fois que la classe récupère cet attribut automatiquement, elle n’utilisera pas la valeur par défaut.
La fonction setattr()
setattr()
est parmi les fonctions intégrées de Python qui nous permettent d’accéder à un attribut de classe. En fait, la fonction setattr()
définit la valeur de l’attribut d’un objet. La syntaxe est la suivante :
setattr(objet, attribut, valeur)
Toujours avec notre classe Personne
définissons une nouvelle valeur pour l’attribut nom
.
# Modifier l'attribut nom
setattr(Personne, 'nom', 'Alain')
# Afficher la nouvelle valeur de nom
print(getattr(Personne, 'nom'))
L’exécution du code.
Alain
En fait, setattr(Personne, 'nom', 'Alain')
est l’équivalent de Personne.nom = "Alain"
.
La fonction delattr()
La fonction native de Python delattr()
supprime l’attribut donné comme paramètre avec l’objet.
# Supprimer l'attribut age
delattr(Personne, "age")
# Vérifier si l'attribut age existe
print(hasattr(Personne, "age"))
L’exécution du code.
False
Une autre manière de vérifier l’existence d’un attribut dans une classe Python, consiste à exécuter le code suivant.
print(dir(Personne))
Très intéressant !!