Lors de la défiintion de classes en Python, il est essentiel de comprendre la gestion des attributs. Prenons l'exemple d'une classe représentant des étudiants dans une école.
class EtudiantEcole:
institut = 'ecole_exemple'
def selectionner_cours(self):
print('sélectionne un cours')
Créons plusieurs instances de cette classe.
etudiant1 = EtudiantEcole()
etudiant2 = EtudiantEcole()
etudiant3 = EtudiantEcole()
Si l'attribut de classe est modifié, toutes les instances en sont affectées.
EtudiantEcole.institut = 'ECOLE_EXEMPLE'
print(etudiant1.institut) # ECOLE_EXEMPLE
print(etudiant2.institut) # ECOLE_EXEMPLE
Les objets possèdent leur propre espace de noms pour stocker des attributs uniques, distincts de l'espace de noms de la classe qui contient les attributs partagés.
print(etudiant1.__dict__) # {}
print(etudiant2.__dict__) # {}
Nous pouvons attribuer des valeurs spécifiques à chaque objet individuellement.
etudiant1.nom = 'jean'
etudiant1.age = 20
etudiant1.genre = 'masculin'
print(etudiant1.nom, etudiant1.age, etudiant1.genre) # jean 20 masculin
try:
print(etudiant2.nom)
except AttributeError as erreur:
print(erreur) # 'EtudiantEcole' object has no attribute 'nom'
etudiant2.nom = 'marie'
etudiant2.age = 22
etudiant2.genre = 'feminin'
print(etudiant2.nom, etudiant2.age, etudiant2.genre) # marie 22 feminin
La recherche d'attributs dans Python suit un ordre précis : l'objet lui-même, puis la classe, et enfin une erreur si l'attribut n'est pas trouvé.
Pour initialiser des attributs de manière structurée, nous pouvons définir une fonction.
def initialiser_etudiant(obj, nom_val, age_val, genre_val):
obj.nom = nom_val
obj.age = age_val
obj.genre = genre_val
initialiser_etudiant(etudiant1, 'pierre', 21, 'masculin')
print(etudiant1.nom, etudiant1.age, etudiant1.genre) # pierre 21 masculin
Cependant, cette approche est manuelle. Pour automatiser l'initialisation lors de la création d'instances, nous utilisons la méthode spéciale __init__.
class EtudiantEcole:
institut = 'ecole_exemple'
def __init__(self, nom_val, age_val, genre_val):
"""Exécuté automatiquement lors de l'instanciation."""
self.nom = nom_val
self.age = age_val
self.genre = genre_val
print('Instance créée avec succès.')
def selectionner_cours(self):
print('sélectionne un cours')
En créant une instance sans arguments, une erreur est levée.
try:
etudiant_invalide = EtudiantEcole()
except TypeError as erreur:
print(erreur) # __init__() missing 3 required positional arguments
En fournissant les arguments requis, l'initialisation se fait automatiquement.
etudiant1 = EtudiantEcole('luc', 19, 'masculin') # Affiche "Instance créée avec succès."
print(etudiant1.__dict__) # {'nom': 'luc', 'age': 19, 'genre': 'masculin'}
Lors de l'appel de la classe, deux étapes se produisent : la création d'un objet vide et l'exécution automatique de la méthode __init__ avec les paramètres fournis.