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

accéder aux attributs d'une classe

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


1 commentaire

GhKerh · 18 septembre 2021 à 15 h 21 min

Très intéressant !!

Laisser un commentaire

Emplacement de l’avatar

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *